2011-12-23 5 views
6

Necesidad básica: Tengo un demonio de Python que llama a otro programa a través de os.system. Mi deseo es poder manejar adecuadamente el apagado del sistema o SIGTERM para permitir que el programa llamado regrese y luego salga.¿Cómo manejar adecuadamente y retener el apagado del sistema (y SIGTERM) para terminar su trabajo en Python?

lo que ya he intentado: He intentado una aproximación utilizando la señal:

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) 

El uso de time.sleep no parece funcionar y el segundo de impresión no se llama.

He leído algunas palabras sobre atexit.register (controlador) en lugar de signal.signal (signal.SIGTERM, handler) pero no se llama a matar.

+1

He copiado tu código y funcionó bien. ¿Qué versión de python estás usando, etc.? –

+1

Tu código parece funcionar. ¿Cuál es la salida/comportamiento que estás recibiendo? –

+0

Espera unos segundos Recojo lo que necesitas. – AsTeR

Respuesta

9

Su código casi funciona, excepto que se olvidó de salir después de la limpieza.

A menudo necesitamos captar otras señales como INT, HUP y QUIT, pero no tanto con daemons.

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) 

En muchos sistemas, los procesos normales no tienen mucho tiempo para limpiar durante el apagado. Para estar seguro, puede write an init.d script detener a su daemon y esperarlo.

+0

Gracias por esa respuesta desarrollada interesante y que lleva a esta documentación de scripts init.d. – AsTeR

Cuestiones relacionadas