Tengo un servidor web donde ejecuto algunos programas de inicio lento como daemons. Estos a veces necesitan un reinicio rápido (o detención) cuando los recompilo o cambie a otra instalación de ellos.Permitir que otros usuarios detengan/reinicien daemons Bash simples: ¿usar señales o qué?
Inspirado por http://mywiki.wooledge.org/ProcessManagement, estoy escribiendo un guión llamada daemonise.sh
que se parece a
#!/bin/sh
while :; do
./myprogram lotsadata.xml
echo "Restarting server..." 1>&2
done
para mantener un "daemon" corriendo. Desde que a veces es necesario para detenerlo, o simplemente reinicio que, corro esa secuencia de comandos en una sesión de pantalla, como:
$ ./daemonise.sh & DPID=$!
$ screen -d
Entonces, tal vez me vuelva a compilar miprograma, instalar a un nuevo camino, empezar el nuevo y quiere matar a la anterior:
$ screen -r
$ kill $DPID
$ screen -d
Esto funciona bien cuando yo soy el único responsable, pero ahora quiere dejar otra persona parada/reinicio del programa, no importa que lo inició. Y para hacer las cosas más complicadas, la secuencia de comandos daemonise.sh
de hecho comienza unos 16 programas, por lo que es una molestia matar a todos y cada uno si no conoce sus PID.
¿Cuál sería la forma de "mejores prácticas" para dejar que otro usuario detenga/reinicie los daemons?
Pensé en sesiones de pantalla compartidas, pero eso solo suena a hacky y inseguro. La mejor solución que he llegado con por ahora es envolver de partida y matar en un guión que atrapa ciertas señales:
#!/bin/bash
DPID=
trap './daemonise.sh & DPID=$!' USR1
trap 'kill $DPID' USR2 EXIT
# Ensure trapper wrapper doesn't exit:
while :; do
sleep 10000 & wait $!
done
Ahora, en caso de que otro usuario tenga que detener los demonios y no puedo hacerlo , ella solo tiene que saber el pid del envoltorio, y por ejemplo sudo kill -s USR2 $wrapperpid
. (Además, esto permite ejecutar los daemons en los reinicios, y aún así eliminarlos limpiamente).
¿Existe una solución mejor? ¿Hay problemas obvios con esta solución que no estoy viendo?
(Después de leer de Greg Wiki Bash, me gustaría evitar cualquier solución que implica pgrep o PID-archivos ...)
+1 para el enlace de la Wiki de Greg's Bash. ¡Buena suerte! – shellter
archivos pid son la mejor convención – reconbot
@wizard tiene razón. no obtendrás una respuesta que valga la pena porque básicamente dices "sé que la rueda existe, pero quiero inventar la mía". –