
La razón por la que estoy haciendo este script es porque quiero demonizar al supervisor: en este momento estoy en un host en la nube en el que no tengo acceso al comando /etc
o sudo
; Este script es mi mejor intento de hacer todo desde mi archivo /home
. Tengo este script bash con el start-stop-daemon
comando pero me permite ejecutarlo varias veces y me gustaría que se ejecute solo una vez. Hasta ahora esto es lo que obtuve:
#! /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
Supongo que cuando se crea el archivo pid, se sobrescribe el anterior, por lo que realizar varias paradas tampoco funciona. ¿Cómo puedo hacer que este script se ejecute solo una vez y no ejecutar múltiples procesos si "inicio el script" 5 veces? Debería quejarse diciendo que el proceso ya está en marcha.
Respuesta1
Descubrí cuál era el problema, mi secuencia de comandos no verificaba si el proceso ya se estaba ejecutando, por lo que simplemente inició tantos procesos como usted lo ejecutaba, pero agregó:
if [ -f $PIDFILE ]; then
echo "supervisord already running: $PIDFILE"
exit 1
fi
en el start)
caso solucionado mi problema, esto verifica si supervisord ha generado su respectivo archivo .pid y si existe no hace nada.