2012-01-26 14 views
6

Sto usando python-daemon e avendo il problema che quando eseguo il processo kill -9, lascia un file pid dietro (ok) e la volta successiva che eseguo il mio programma non funziona a meno che non abbia già rimosso il file pid a mano (non ok).il contesto python-daemon non viene avviato quando è presente un file PID stantoso

prendo tutte le eccezioni in modo che context.close() si chiama prima di terminare - quando questo accade (per esempio su un kill) i file /var/run/mydaemon.pid* vengono rimossi e una successiva corsa daemon riesce. Tuttavia, quando si utilizza SIGKILL (kill -9), non ho la possibilità di chiamare context.close() e rimangono i file/var/run. In questo caso, la prossima volta che eseguo il mio programma non si avvia correttamente: il processo originale ritorna, ma il processo demonizzato blocca a context.open().

Sembra che python-daemon dovrebbe notare che esiste un file pid per un processo che non esiste più e che lo elimina, ma ciò non sta accadendo. Dovrei farlo a mano?

Nota: non sto utilizzando with perché questo codice viene eseguito su 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() 

risposta

1

Se si sta eseguendo Linux, e i blocchi del livello di processo sono accettabili, continua a leggere.

Proviamo ad acquisire la serratura. Se fallisce, controlla se il blocco è acquisito da un processo in esecuzione. Se no, rompere il blocco e continuare.

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 

Edit: Sembra che PIDLockFile è disponibile solo su file di lock> = 0,9

+0

E 'stato due anni fa, quindi la mia memoria è confusa, ma sì, credo che questo è come ho fatto (cosa intendevo per "facendo questo a mano" a cui si fa riferimento nella domanda). Contrassegnare come risposta perché perché no. – kdt

1

Con lo script fornito here il file pid rimane sul kill -9 come dici tu, ma lo script pulisce anche su correttamente al riavvio.

Problemi correlati