Usando el trabajo cron para verificar si el script de Python se está ejecutando

Actualmente tengo una aplicación de servidor web de Python en ejecución y me gustaría usar un script de Python para el trabajo cron para verificar si la aplicación se está ejecutando, de lo contrario, inicie la aplicación.

Tengo el siguiente código de la siguiente manera:

import os string = os.popen('ps aux') n = 0 for line in string.readlines(): if "python webserver.py" in line: n+=1 if n < 1: os.system('python webserver.py') 

Ahora el script ha ejecutado la aplicación. Pero lo que quiero es que el script inicie la aplicación y salga, dejando la aplicación en ejecución. ¿Hay alguna manera de hacerlo? Gracias por adelantado.

Me gusta hacer esto con un script de shell similar al siguiente. Es simple y tiene poca probabilidad de errores. Generalmente pongo esto en un bucle de tiempo con el modo de dormir al final, pero el cron funciona bien también.

 if [ -x myproc.pid ] ; then pid=`cat myproc.pid` else pid=1 fi kill -0 $pid #check if process is still running 

Como puede ver, requiere que su proceso escriba su PID en un archivo cuando se inicie. Esto evita problemas con la salida de grepping ps, ya que puede ser difícil obtener una expresión regular que siempre funcione, independientemente de los nuevos nombres de proceso que ingresen a su servidor en el futuro. El archivo PID está muerto.

kill -0 es una forma poco conocida de verificar si un proceso se está ejecutando y es más simple que buscar un directorio en /proc . La línea con pid=1 está ahí porque el verificador no es root, por lo tanto, la verificación de interrupción siempre fallará si no puede enviar señales al proceso. Eso es para cubrir la primera vez que myproc se ejecuta en este servidor. Tenga en cuenta que esto significa que el script de comprobación no debe ejecutarse como root (generalmente es una buena práctica), sino que debe ejecutarse como el mismo usuario que ejecuta el proceso que está verificando.

Si realmente quieres hacer esto en Python, entonces el módulo os tiene acceso a los PID y tiene un método de kill . Sin embargo, no devuelve un código de salida de shell, en os.kill lugar, os.kill lanza excepciones OSError que puede manejar en un bloque trycatch . El mismo principio se aplica al uso de la señal 0 para detectar si el proceso existe o no, pero existe una pequeña posibilidad de que su proceso haya muerto y otro proceso ahora tenga el mismo pid, así que maneje ese caso en su trycatch .

Creo que sería mejor si hiciera que su servidor web escriba su ID de proceso en un archivo y luego haga que el trabajo cron lo lea y compruebe si el proceso se está ejecutando.

También sería útil utilizar algún tipo de marco que os.system gestión de procesos (por ejemplo, supervisor, inicio, etc.) en lugar de iniciarlo manualmente utilizando os.system .

Probablemente podría hacerlo iniciando la aplicación en segundo plano y posiblemente haciendo que sea inmune a colgar las señales.

Intente cambiar el comando del sistema para:

 nohup python webserver.py &