2012-01-26 12 views
6

Estoy usando python-daemon, y tengo el problema de que cuando kill -9 un proceso, deja un archivo pid (ok) y la próxima vez que ejecuto mi programa no funciona a menos que ya haya eliminado el archivo pid a mano (no está bien).contexto python-daemon no se inicia cuando hay un archivo PID obsoleto

que capturar todas las excepciones con el fin de que context.close() se llama antes de terminar - cuando esto ocurre (por ejemplo en un kill) los archivos se eliminan /var/run/mydaemon.pid* y una posterior ejecución demonio tiene éxito. Sin embargo, al usar SIGKILL (kill -9), no tengo la oportunidad de llamar al context.close(), y los archivos/var/run permanecen. En este caso, la próxima vez que ejecute mi programa no se iniciará correctamente: el proceso original retorna, pero el proceso daemonizado bloquea al context.open().

Parece que python-daemon debería notar que hay un archivo pid para un proceso que ya no existe y borrarlo, pero eso no está sucediendo. ¿Se supone que debo estar haciendo esto a mano?

Nota: No estoy usando with porque el código se ejecuta en Python 2,4

from daemon import DaemonContext 
from daemon.pidlockfile import PIDLockFile 

context = DaemonContext(pidfile = PIDLockFile("/var/run/mydaemon.pid")) 
context.open() 

try: 
    retry_main_loop() 
except Exception, e: 
    pass 
context.close() 

Respuesta

1

Si ejecuta Linux y los bloqueos de nivel de proceso son aceptables, siga leyendo.

Intentamos adquirir la cerradura. Si falla, compruebe si el bloqueo se adquiere mediante un proceso en ejecución. Si no, rompe el candado y continúa.

from lockfile.pidlockfile import PIDLockFile 
from lockfile import AlreadyLocked 

pidfile = PIDLockFile("/var/run/mydaemon.pid", timeout=-1) 
try: 
    pidfile.acquire() 
except AlreadyLocked: 
    try: 
     os.kill(pidfile.read_pid(), 0) 
     print 'Process already running!' 
     exit(1) 
    except OSError: #No process with locked PID 
     pidfile.break_lock() 

#pidfile can now be used to create DaemonContext 

Editar: Parece que PIDLockFile sólo está disponible en el archivo de bloqueo> = 0,9

+0

Fue hace dos años por lo que mi memoria es vaga, pero sí, creo que esto es cómo lo hice (lo que quería decir "haciendo esto a mano" referenciado en la pregunta). Marcado como respuesta porque por qué no. – kdt

1

Con el guión previsto here el archivo pid permanece en kill -9 como usted dice, pero el guión también limpia correctamente en un reinicio.

Cuestiones relacionadas