2011-12-23 12 views
6

Esigenze di base: Possiedo un demone Python che chiama un altro programma tramite os.system. Il mio desiderio è di essere in grado di gestire correttamente l'arresto del sistema o SIGTERM per consentire al programma richiamato di tornare e quindi di uscire.Come gestire e mantenere correttamente l'arresto del sistema (e SIGTERM) per completare il lavoro in Python?

Quello che ho già provato: Ho provato un approccio con il segnale:

import signal, time 

def handler(signum = None, frame = None): 
    print 'Signal handler called with signal', signum 
    time.sleep(3) 
    #here check if process is done 
    print 'Wait done' 

signal.signal(signal.SIGTERM , handler) 

while True: 
    time.sleep(6) 

L'utilizzo di time.sleep non sembra funzionare e la seconda di stampa non è mai chiamato.

Ho letto poche parole su atexit.register (gestore) anziché signal.signal (signal.SIGTERM, gestore) ma non viene chiamato nulla su kill.

+1

Ho copiato il codice e ha funzionato bene. Quale versione di Python stai usando, ecc? –

+1

Il tuo codice sembra funzionare. Qual è l'output/comportamento che stai ottenendo? –

+0

Aspetta un secondo raccolgo quello che ti serve. – AsTeR

risposta

9

Il tuo codice funziona quasi, tranne che hai dimenticato di uscire dopo la pulizia.

Spesso abbiamo bisogno di catturare vari altri segnali come INT, HUP e QUIT, ma non tanto con i demoni.

import sys, signal, time 

def handler(signum = None, frame = None): 
    print 'Signal handler called with signal', signum 
    time.sleep(1) #here check if process is done 
    print 'Wait done' 
    sys.exit(0) 

for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]: 
    signal.signal(sig, handler) 

while True: 
    time.sleep(6) 

Su molti sistemi, i processi ordinari non hanno molto tempo da pulire durante lo spegnimento. Per sicurezza, è possibile write an init.d script arrestare il demone e attendere.

+0

Grazie per questa interessante risposta sviluppata e che porta alla documentazione di questo script init.d. – AsTeR

Problemi correlati