Estoy ejecutando mi script Python en segundo plano en mi máquina Ubuntu (12.04) así:
nohup python testing.py > test.out &
Ahora, podría ser posible que en algún momento mi anterior Python script
pueda morir por cualquier razón.
Así que estoy pensando en tener algún tipo de cron agent
script de shell bash que pueda reiniciar mi script Python anterior automáticamente si se elimina por cualquier razón.
¿Es posible hacerlo? En caso afirmativo, ¿cuál es la mejor manera de resolver este tipo de problema?
ACTUALIZAR:
Después de crear el testing.conf
archivo así:
chdir /tekooz
exec python testing.py
respawn
Ejecuté debajo del comando sudo para iniciarlo, pero no puedo ver ese proceso ejecutándose con ps ax.
root@bx13:/bezook# sudo start testing
testing start/running, process 27794
root@bx13:/bezook# ps ax | grep testing.py
27806 pts/3 S+ 0:00 grep --color=auto testing.py
¿Alguna idea de por qué px axe no me muestra nada? ¿Y cómo verifico si mi programa se está ejecutando o no?
Este es mi script de Python:
#!/usr/bin/python
while True:
print "Hello World"
time.sleep(5)
/etc/init
archivo? Si me puede proporcionar una guía paso a paso, entonces podré aprender algo y hacer lo correcto ..sys.stdout = open(file_name, 'w')
al principio.px ax | grep testing.py
... ¿Me está devolviendo nada? ¿Alguna idea de por qué?También podría adoptar un enfoque más orientado a la shell. Eche un
cron
vistazo a su script y reinícielo si muere.Cree un nuevo crontab ejecutando
crontab -e
. Esto abrirá una ventana de su editor de texto favorito.Agregue esta línea al archivo que acaba de abrir
Guarde el archivo y salga del editor.
Acaba de crear una nueva
crontab
que se ejecutará cada 5 minutos y ejecutará su script a menos que ya se esté ejecutando. Vea aquí para ver un pequeño tutorial sobrecron
. Los documentos oficiales de Ubuntucron
están aquí .El comando real que se ejecuta es el
pgrep
que busca en los procesos en ejecución la cadena dada en la línea de comando.pgrep foo
buscará un programa llamadofoo
y devolverá su identificador de proceso .pgrep -f
hace que busque en toda la línea de comando utilizada para iniciar el programa y no solo en el nombre del programa (útil porque se trata de un script de Python).El
||
símbolo significa "hacer esto si falla el comando anterior". Entonces, si su script no se está ejecutando,pgrep
fallará ya que no encontrará nada y se iniciará su script.fuente
crontab -e
desde el directorio donde está mi script de Python. ¿Correcto?cron
es un demonio de programación, es un servicio que se ejecuta en segundo plano. Si su script de Python no está en su$PATH
(si no puede iniciarlo desde cualquier lugar pero necesita estar en su directorio) use la ruta completa al script como en mi respuesta actualizada.Puede hacer que el programa de prueba redirija la salida utilizando una opción de línea de comandos y luego use un script simple de Python para reiniciar el programa indefinidamente:
puedes poner este programa en segundo plano, y una vez que quieras detenerlo, simplemente llévalo al primer plano y mátalo.
fuente
Realmente no deberías usar esto para la producción, pero podrías:
Si, por algún motivo, el proceso de Python se cierra, el ciclo de shell continuará y lo reiniciará, agregando al
.out
archivo lo que desee. Casi sin gastos generales y lleva muy poco tiempo configurarlo.fuente
Hay varias formas de monitorear y reaparecer procesos bajo UNIX / Linux. Una de las más antiguas es una entrada de "reaparición" en / etc / inittab ... si está utilizando el antiguo sistema de inicio SysV. Otro método es utilizar el demonio supervisor del paquete daemontools de DJ Bernstein . Otras opciones son usar funciones en Ubuntu upstart ... o systemd u otros.
Pero puede ver las alternativas init y en el código Python para Pardus: mudur daemon en particular.
Si decide ir con un trabajo cron (y el manejo de archivos PID), considere leer este PEP 3143 y quizás usar su implementación de referencia.
Como mencioné en mis otros comentarios, el manejo robusto de archivos PID es complicado. Es propenso a las carreras y los casos de esquina. Se vuelve más complicado si hay alguna posibilidad de que su archivo PID termine en un NFS u otro sistema de archivos en red (algunas de las atomicidades le garantizan que la semántica de manejo de archivos en sistemas de archivos UNIX / Linux locales correctos desaparece en algunas versiones e implementaciones de NFS, por ejemplo). También la semántica en torno al bloqueo de archivos bajo UNIX puede ser complicada. (¿Se libera rápidamente un bloqueo
flock
ofcntl
, en su sistema operativo de destino, cuando el proceso que lo mantiene se elimina con SIGKILL, por ejemplo?).fuente
También puede usar el monitoreo de Monit o Process con ps-watcher
Aquí hay un ejemplo para su escenario:
Echa un vistazo a los ejemplos de monit
fuente
Necesita un supervisor, puede usar el supervisor . Es un supervisor basado en Python, por lo tanto, es fácil de modificar si es necesario.
El control es con archivos con sintaxis de archivo .ini.
fuente
La respuesta de Terdon, no funcionó para mí, porque
pgrep -f testing.py
nunca estaba "fallando". Tomaría el pid para el trabajo cron (debido a la opción -f). Sin embargo, sin la opción -f, pgrep no encontrará testing.py porque no hay un proceso llamado testing.py.Mi solución a esto fue cambiar
a
esto significa que el trabajo completo de crontab sería:
fuente
En mi caso, como una solución rápida, quería mantener mi programa ejecutándose cuando salió con un error o fue eliminado. Por otro lado, quería detener la ejecución cuando el programa terminaba correctamente (código de retorno = 0)
Lo he probado en Bash. Debería funcionar bien en cualquier otro caparazón
fuente
Para la respuesta de terdon,
pgrep -f testing.py
nunca volverá falso de acuerdo con los comentarios aquí :Para la respuesta de Matt,
pgrep -f testing.py
es inútil ya quepgrep python
coincide con cualquier script Python en ejecución. Entonces, si dos cronjob de script Python, el segundo cronjob nunca se ejecutará.Y luego encontré la solución para resolver
pgrep -f testing.py
en el comentario aquí: https://askubuntu.com/questions/1014559/running-pgrep-in-a-crontab?noredirect=1&lq=1Mi cron para ejecutar dos scripts de Python:
fuente