linux - ¿Se puede usar el inicio/expectativa/regeneración en procesos que se dividen más de dos veces?
rhel upstart (1)
Estoy usando upstart para iniciar / detener / reiniciar automáticamente los demonios. Uno de los demonios se bifurca 4 veces. El recetario de cocina dice que solo soporta forking dos veces. ¿Hay una solución?
Como falla
Si trato de usar expect daemon
o expect fork
, upstart usa el pid de la segunda fork. Cuando trato de detener el trabajo, nadie responde a la señal SIGKILL ascendente y se cuelga hasta que se agota el espacio pid y se da la vuelta. Se pone peor si agregas reaparición. Upstart piensa que el trabajo murió e inmediatamente comienza otro.
Error reconocido por upstream
Se ha introducido un error para upstart. Las soluciones presentadas se ajustan al antiguo sysvinit, reescriben su daemon o esperan una reescritura. RHEL lleva casi 2 años de retraso con respecto al último paquete de inicio, por lo que cuando se publique la reescritura y nos actualicemos, la espera probablemente será de 4 años. El daemon está escrito por un subcontratista de un subcontratista de un contratista, por lo que tampoco será reparado en el corto plazo.
Se me ocurrió un truco feo para hacer que esto funcione. Funciona para mi aplicación en mi sistema. YMMV.
- iniciar la aplicación en la sección de preinicio
- en la sección de secuencias de comandos, ejecute una secuencia de comandos que se ejecute mientras se ejecute la aplicación. El pid de este script es lo que hará el inicio.
- en la sección posterior a la parada mata la aplicación
ejemplo
env DAEMON=/usr/bin/forky-application
pre-start script
su -s /bin/sh -c "$DAEMON" joeuseraccount
end script
script
sleepWhileAppIsUp(){
while pidof $1 >/dev/null; do
sleep 1
done
}
sleepWhileAppIsUp $DAEMON
end script
post-stop script
if pidof $DAEMON;
then
kill `pidof $DAEMON`
#pkill $DAEMON # post-stop process (19300) terminated with status 1
fi
end script
un enfoque similar podría ser tomado con archivos pid.