¿Cómo ejecuto un script de Python en segundo plano y lo reinicio después de un bloqueo?

10

Tengo un script Python muy simple que me gustaría ejecutar siempre en mi servidor Ubuntu 12.04. Pensé en usar advenedizo + monit. El problema es que esas herramientas parecen bastante complicadas para un simple mortal como yo, y no puedo encontrar un ejemplo simple en la web.

¿Es advenedizo + monit overkill? ¿Alguien sabe una alternativa más simple, o un buen tutorial para advenedizo + monitor? Si solo quiero estar seguro de que el script siempre se está ejecutando, ¿se requiere monit?

sebpiq
fuente
Como referencia, se le preguntó exactamente la misma pregunta aquí: superuser.com/q/461546/786969
PHPirate

Respuestas:

16

La forma más sencilla de hacer esto es colocar esto en /etc/init/something.conf:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Respawn lo iniciará nuevamente si se elimina o sale de un valor distinto de cero (como una excepción no detectada). Esto funcionará volviendo a Ubuntu 10.04.

Si tiene 12.04 puede ser más elegante. Lo anterior ejecutará su script como root. En 12.04 puede agregar setuid / setgid:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Si su script se cierra cuando no hay una red disponible y planea ejecutarlo en una conexión de red inestable, bueno, debe solucionarlo y hacer que se mantenga vivo / reintentar. Pero si no puede, es posible que también deba iniciarlo manualmente cuando aparezca un dispositivo de red. Entonces puede colocar esto en /etc/network/if-up.d/yourscript(hacerlo ejecutable con chmod + x)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Donde su script es simplemente algo arbitrario y exclusivo de este script en particular, y "algo" es el mismo que el nombre del trabajo (como el /etc/init/something.confsugerido anteriormente).

SpamapS
fuente
Si ! Entonces esto está usando upstart¿verdad? ¿Significa esto que el script también se iniciará en el arranque (¡lo cual sería genial!)? ¿Y respawnes suficiente para que no necesite configurar monit?
sebpiq
Sí, el 'inicio en el nivel de ejecución [2345]' significa en el momento en que el sistema ingresa al "modo multiusuario". A largo plazo, se está formando un plan para reemplazar el muy antiguo "nivel de ejecución" de Unixy con cosas como "iniciar al iniciar servicios de red" y "detener al detener servicios de red" para que se lea más lógicamente.
SpamapS
Increíble ! Muchas gracias, eso es exactamente lo que necesitaba.
sebpiq
2

El enfoque habitual de los viejos tiempos era escribir un archivo que contenga una marca de tiempo o la identificación del proceso /tmpy luego verificar si esta identificación del proceso todavía se estaba ejecutando o, respectivamente, si la marca de tiempo aún era reciente.

También podría hacer un simple while [ 1 ]; do phyton-script.ph; doneque reiniciaría el script en caso de que regrese.

Para obtener más posibilidades, proporcione más información sobre su secuencia de comandos. Especialmente en por qué esperas que salga o se bloquee inesperadamente.

confundir
fuente
el script simplemente elimina los tweets de los usuarios de Twitter utilizando una API de transmisión. Básicamente, hay un bucle infinito esperando que se envíen los tweets, ejecutando algún código y volviendo a esperar. Solo quiero que esto se ejecute sin preocuparse ... si hay un error y se bloquea, y así sucesivamente ...
sebpiq
Una respuesta similar a la suya (que acepté): superuser.com/questions/461546/...
sebpiq
También puede ser una buena idea un cron-job para verificar si el script aún se está ejecutando.
con-f-use