Estoy buscando una forma estándar o una mejor práctica para mantener vivo un demonio iniciado por un init.d
script de shell.
O incluso mejor, ¿hay alguna manera de mantenerlo vivo directamente /etc/init.d
?
Específicamente, tengo un demonio llamado dtnd con un bucle infinito que busca un proceso finalizado inesperado, si hay alguno, el demonio los despierta nuevamente. Además, utilizo la herramienta start-stop-daemon para permitir que el preceso se ejecute desde un usuario del sistema dado.
Quiero ejecutar este demonio dtnd desde el inicio. Para lograr este comportamiento, creé un script init.d que "envuelve" el archivo dtnd usando los comandos de inicio, detención y estado.
Tengo 2 preguntas que me gustaría resolver:
¿Hay alguna manera de lograr mantener vivo algún proceso del script de shell init.d ? ¿Es una práctica estándar / mejor práctica?
¿Se recomienda mantener vivo un proceso con bucle infinito? Supongo que es mejor usar algún comando como
respawn
para lograr eso. ¿Es correcto?
Sé sobre la existencia del respawn
comando. Creo que eso es lo que necesito, pero no entiendo el flujo de trabajo entre /etc/init.d/
y /etc/init
. ¿Alguien puede ayudarme?
Tenga en cuenta que no tengo ni advenedizo inittab (que sólo se me permite el uso /etc/init
, /etc/init.d
, cron
y las herramientas del sistema como start-stop-daemon
. Es decir, sólo las herramientas por defecto)
¡Muchísimas gracias por su tiempo!
Respuestas:
Debian eventualmente tendrá systemd, por lo que esta es la forma de hacerlo en un sistema Linux que usa systemd (y muchos ya lo hacen; puede considerar cambiar las distribuciones).
Systemd puede manejar mantener el servicio vivo para usted automáticamente; No se requieren otras herramientas. Simplemente asegúrese de que
Restart=always
esté configurado en la[Service]
sección del archivo de servicio .También hay disponibles otras opciones para escenarios más complejos.
fuente
systemd
parece descartarinit.d
guión y base en*.service
systemctl edit myservice
, luegosystemctl daemon-reload
y reinicie myservice.Se podría añadir que
/etc/inittab
conrespawn
:Es un truco sucio, pero lo he usado con éxito en el pasado en sistemas sysv-init más antiguos.
fuente
Bueno, esa es una de las razones principales, por qué Debian se está moviendo a systemd.
sysvinit (/etc/init.d) no puede detectar si un servicio está inactivo / no responde. Esto significa que debe monitorear estos servicios y escalar si un servicio ya no hace su trabajo.
probablemente lo más fácil sería migrar a otro daemonhandler como systemd (predeterminado en RHEL7, será predeterminado en los próximos debian y ubuntu lts), upstart (predeterminado en RHEL6, Ubuntu 12.04 y 14.04), daemontools (como se mencionó, desarrollado por djb) o algo más.
hacer el trabajo de mantener vivo un servicio será PITA en sysvinit.
fuente
La mejor práctica es asegurarse de que sus demonios NO SE DETENGAN en primer lugar.
Si no lo desea, puede echar un vistazo a las herramientas demoníacas de DJB
fuente
El enfoque estándar para mí es usar la utilidad Monit para esto.
No puedo decir por su descripción si ha escrito algo como Monit y está tratando de asegurarse de que se está ejecutando, o si necesita algo para ver el demonio que ha creado.
fuente