Daemon vs Upstart para script en python
monit python-daemon (3)
A partir de su mención de Upstart, asumiré que esta pregunta es para un servicio que se ejecuta en un servidor Ubuntu.
En un servidor Ubuntu, un trabajo inicial es realmente la opción más simple y conveniente para crear un servicio siempre en servicio que se inicie en el momento adecuado y se pueda detener o volver a cargar con comandos conocidos.
Para crear un servicio de arranque, debe agregar un solo archivo a /etc/init
. Llamado <service-name>.conf
. Un ejemplo de script se ve así:
description "My chat server"
author "[email protected]"
start on runlevel [2345]
stop on runlevel [!2345]
env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set
respawn
exec /srv/applications/chat.py
Esto significa que cada vez que se inicia la máquina, se iniciará el programa chat.py
Si muere por cualquier motivo, lo reiniciará. No tiene que preocuparse por el doble bifurcación o por la demonización de su código. Eso es manejado por ti por upstart.
Si desea detener o iniciar el proceso, puede hacerlo con
service chat start
service chat stop
El nombre del chat
se encuentra automáticamente en el nombre del archivo .conf
dentro de /etc/init
Solo estoy cubriendo los conceptos básicos de advenedizo aquí. Hay muchas otras características para que sea aún más útil. Todo disponible por el man upstart
ejecutando man upstart
.
Este método es mucho más conveniente que escribir su propio código de demonización. Un archivo de configuración de 4-8 líneas para un componente integrado de Ubuntu es mucho menos propenso a errores que hacer que su código sea un tenedor doble y luego hacer que otro proceso lo supervise para asegurarse de que no desaparezca.
Monit es un poco de una pista falsa. Si desea alertas de tiempo de inactividad, deberá ejecutar un programa de monitoreo en un servidor separado de todos modos. Confíe en upstart para que el proceso se ejecute siempre en un servidor. Luego, tenga un servicio diferente que se asegure de que el servidor se esté ejecutando realmente. El tiempo de inactividad ocurre por muchas razones diferentes. Un proceso que se ejecute en el mismo servidor no le dirá precisamente nada si el servidor se cae. Necesita una máquina separada (o un proveedor externo como pingdom) para avisarle sobre esa condición.
He escrito un módulo en Python y quiero que se ejecute continuamente una vez iniciado y necesito detenerlo cuando necesito actualizar otros módulos. Es probable que esté usando monit para reiniciarlo, si el módulo se ha bloqueado o no se está ejecutando.
Estaba pasando por diferentes técnicas como Daemon , Upstart y muchas otras.
¿Cuál es la mejor manera de ir para que use ese enfoque en mis nuevos módulos para seguir ejecutándolos para siempre?
Podrías echarle un vistazo al supervisor . Lo que es capaz de hacer es iniciar un proceso al iniciar el sistema, y luego mantenerlo vivo hasta que se apague.
El archivo de configuración más simple sería:
[program:my_script]
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR
autostart = True
autorestart = True
Luego, puede vincularlo a /etc/supervisord/conf.d
, ejecutar sudo supervisorctl
para ingresar a la consola de administración del supervisor, escribir de nuevo para que el supervisor note la nueva entrada de configuración y update
para mostrar los nuevos programas en la lista de status
.
Para iniciar / reiniciar / detener un programa, puede ejecutar sudo supervisorctl start/restart/stop my_script
.
Utilicé initscript de estilo antiguo con la utilidad start-stop-daemon. Mire skel en /etc/init.d