
A razão pela qual estou fazendo este script é porque quero daemonizar o supervisord: no momento estou em um host de nuvem no qual não tenho acesso ao /etc
ou ao sudo
comando; este script é minha melhor tentativa de fazer tudo do meu arquivo /home
. Eu tenho esse script bash com o start-stop-daemon
comando, mas ele me permite executá-lo várias vezes e gostaria que fosse executado apenas uma vez. Até agora aqui está o que consegui:
#! /bin/bash
SUPERVISORD=/usr/local/bin/supervisord
PIDFILE=/home/user/supervisor/supervisord.pid
OPTS="-c /home/user/supervisor/supervisord.conf -j $PIDFILE"
test -x $SUPERVISORD || exit 0
. /lib/lsb/init-functions
export PATH="${PATH:+$PATH:}/usr/local/bin:/usr/sbin:/sbin"
case "$1" in
start)
log_begin_msg "Starting Supervisor daemon manager..."
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
log_end_msg 0
;;
stop)
log_begin_msg "Stopping Supervisor daemon manager..."
start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE || log_end_msg 1
log_end_msg 0
;;
restart|reload|force-reload)
log_begin_msg "Restarting Supervisor daemon manager..."
start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
log_end_msg 0
;;
*)
log_success_msg "Usage: {start|stop|reload|force-reload|restart}"
exit 1
;;
esac
exit 0
Presumo que quando o arquivo pid é criado, ele substitui o anterior, portanto, fazer várias paradas também não funciona. Como posso fazer com que esse script seja executado apenas uma vez e não execute vários processos se eu "iniciar o script" 5 vezes? Deveria reclamar dizendo que o processo já está em execução.
Responder1
Eu descobri qual era o problema, meu script não estava verificando se o processo já estava em execução, então ele apenas iniciou quantos processos você executasse, mas adicionando:
if [ -f $PIDFILE ]; then
echo "supervisord already running: $PIDFILE"
exit 1
fi
no start)
caso resolveu meu problema, isso verifica se o supervisord gerou seu respectivo arquivo .pid e se existir não faz nada.