Daemon vs Upstart para python script


He escrito un módulo en Python y quiero que se ejecute continuamente una vez iniciado y necesito detenerlo cuando necesite 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 muchos otros.

¿Cuál es la mejor manera de usar ese enfoque a través de todos mis nuevos módulos para seguir ejecutándolos para siempre?

Author: meawoppl, 2013-07-19

3 answers

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 advenedizo es realmente la opción más simple y conveniente para crear un servicio siempre activo que se inicia en el momento adecuado y se puede detener o recargar con comandos familiares.

Para crear un servicio advenedizo necesita agregar un solo archivo a /etc/init. Llamado <service-name>.conf. Un script de ejemplo 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 inicie la máquina se iniciará el programa chat.py. Si muere por cualquier razón, lo reiniciará. Usted no tiene que preocuparse de doble bifurcación o de otra manera daemonizing su código. Eso lo maneja advenedizo.

Si desea detener o iniciar su proceso, puede hacerlo con

service chat start 
service chat stop

El nombre chat se encuentra automáticamente a partir del nombre del archivo .conf dentro de /etc/init

Solo estoy cubriendo los conceptos básicos de advenedizo aquí. Hay un montón de otros características para hacerlo aún más útil. Todo está disponible ejecutando man upstart.

Este método es mucho más conveniente que escribir su propio código de daemonización. Un archivo de configuración de 4-8 líneas para un componente incorporado de Ubuntu es mucho menos propenso a errores que hacer que su código se bifurca de forma segura y luego tener otro proceso monitorearlo para asegurarse de que no desaparezca.

Monit es un poco 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 mantener el proceso siempre ejecutándose en un servidor. Luego, tenga un servicio diferente que se asegure de que el servidor se esté ejecutando. El tiempo de inactividad ocurre por muchas razones diferentes. Un proceso que se ejecuta en el mismo servidor no le dirá exactamente nada si el servidor se cae. Necesita una máquina separada (o un proveedor externo como pingdom) para alertarlo sobre esa condición.

 77
Author: aychedee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-27 08:19:07

Usted podría comprobar hacia fuera supervisor. De lo que es capaz es iniciar un proceso en el inicio del sistema, y luego mantenerlo vivo hasta el apagado.

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 de supervisor, escribir reread para que supervisor note una nueva entrada de configuración y update para mostrar nuevos programas en la lista status.

Para iniciar / reiniciar / detener un programa que podría ejecutar sudo supervisorctl start/restart/stop my_script.

 8
Author: Maciej Gol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-28 10:35:00

Usé initscript de estilo antiguo con la utilidad start-stop-daemon.Mira skel en / etc / init.d

 3
Author: eri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-27 17:59:25