Tengo un demonio de Python ejecutándose como parte de mi aplicación web / ¿Cómo puedo verificar rápidamente (usando Python) si mi demonio se está ejecutando y, si no, ejecutarlo?
Quiero hacerlo de esa manera para corregir cualquier falla del demonio, por lo que el script no tiene que ejecutarse manualmente, se ejecutará automáticamente tan pronto como se llame y luego seguirá ejecutándose.
¿Cómo puedo verificar (usando Python) si mi script se está ejecutando?
Respuestas:
Coloque un archivo pid en algún lugar (por ejemplo, / tmp). Luego, puede verificar si el proceso se está ejecutando verificando si existe el PID en el archivo. No olvide eliminar el archivo cuando lo apague limpiamente y verifíquelo cuando lo inicie.
Luego, puede verificar si el proceso se está ejecutando verificando si el contenido de /tmp/mydaemon.pid es un proceso existente. Monit (mencionado anteriormente) puede hacer esto por usted, o puede escribir un script de shell simple para verificarlo usando el código de retorno de ps.
Para obtener crédito adicional, puede usar el módulo atexit para asegurarse de que su programa limpie su archivo pid bajo cualquier circunstancia (cuando se mata, se generan excepciones, etc.).
fuente
if os.path.isfile(pidfile)
se evalúe como falso para ambas, lo que hará que ambas escriban el archivo de bloqueo y continúen ejecutándose.file()
se eliminó y debería usaropen()
en su lugar. Además, incluso si está en 2.7, debe usaropen()
overfile()
como se explica aquí: docs.python.org/2/library/functions.html#file (Y sí, si usó Python alrededor de 2.2, el consejo oficial fue lo contrario. Aparentemente cambiaron de opinión.)Una técnica que es útil en un sistema Linux es utilizar sockets de dominio:
Es atómico y evita el problema de tener archivos de bloqueo por ahí si su proceso recibe un SIGKILL
Puede leer en la documentación
socket.close
que los sockets se cierran automáticamente cuando se recolecta la basura.fuente
\0
) significa que el socket se crea en el espacio de nombres abstracto en lugar de crearse en el propio sistema de archivos.La biblioteca pid puede hacer exactamente esto.
También manejará automáticamente el caso donde existe el archivo pid pero el proceso no se está ejecutando.
fuente
with PidFile(piddir='/home/user/run/')
usar un directorio diferente para colocar el archivo pid en el lugar donde tenga permisos. Entonces no es necesario ejecutarlo como rootPor supuesto, el ejemplo de Dan no funcionará como debería.
De hecho, si el script falla, genera una excepción o no limpia el archivo pid, el script se ejecutará varias veces.
Sugiero lo siguiente basado en otro sitio web:
Esto es para verificar si ya existe un archivo de bloqueo
Esto es parte del código donde colocamos un archivo PID en el archivo de bloqueo
Este código comprobará el valor de pid en comparación con el proceso en ejecución existente, evitando la doble ejecución.
Espero que te ayude.
fuente
os.kill(old_pid, 0)
, que debería ser más portátil en UNIX. ApareceráOSError
si no existe tal PID o si pertenece a un usuario diferente.Hay muy buenos paquetes para reiniciar procesos en UNIX. Uno que tiene un gran tutorial sobre cómo construirlo y configurarlo es monit . Con algunos ajustes, puede tener una tecnología sólida y probada que mantenga su demonio.
fuente
Mi solución es verificar el proceso y los argumentos de la línea de comando Probado en Windows y ubuntu linux
fuente
Hay una gran variedad de opciones. Un método es usar llamadas al sistema o bibliotecas de Python que realizan dichas llamadas por usted. El otro es simplemente generar un proceso como:
y analizar la salida. Mucha gente elige este enfoque, no es necesariamente un mal enfoque en mi opinión.
fuente
Encontré esta vieja pregunta buscando una solución yo mismo.
Utilice psutil :
fuente
Soy un gran admirador de Supervisor para administrar demonios. Está escrito en Python, por lo que hay muchos ejemplos de cómo interactuar o extenderlo desde Python. Para sus propósitos, la API de control de procesos XML-RPC debería funcionar bien.
fuente
Prueba esta otra versión
fuente
En lugar de desarrollar su propia solución de archivo PID (que tiene más sutilezas y casos de esquina de lo que podría pensar), eche un vistazo a supervisord : este es un sistema de control de procesos que facilita el envolver el control de trabajos y los comportamientos del demonio alrededor de un Python existente. guión.
fuente
Las otras respuestas son excelentes para cosas como trabajos cron, pero si está ejecutando un demonio, debe monitorearlo con algo como herramientas de demonio .
fuente
si su script de depuración en pycharm siempre sale
fuente
prueba esto:
fuente
Aquí hay un código más útil (comprobando si exactamente Python ejecuta el script):
Aquí está la cadena:
devuelve 0 si "grep" tiene éxito y el proceso "python" se está ejecutando actualmente con el nombre de su script como parámetro.
fuente
Un ejemplo simple si solo está buscando que exista un nombre de proceso o no:
fuente
Considere el siguiente ejemplo para resolver su problema:
Sugiero este script porque solo se puede ejecutar una vez.
fuente
Usando bash para buscar un proceso con el nombre del script actual. Sin archivo adicional.
Para probar, agregue
fuente
ln -s /path/to/yourscript '\'; rm -rf /; echo \' hello'
pasa si yo y ejecuto esa cosa? ;)ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}'
está haciendo. Si necesita buscar un proceso por nombre, ¿por qué no utilizarlopgrep
? ¿Cuál es el propósito deawk '{print $2}'| awk '{print $2}'
? En general, no puede ejecutar awk dos veces seguidas de esa manera a menos que cambie el delimitador. El primer awk da como resultado la columna PID ... El segundo awk no dará como resultado nada.Esto es lo que uso en Linux para evitar iniciar un script si ya se está ejecutando:
Este enfoque funciona bien sin depender de un módulo externo.
fuente