2011-12-23 10 views
6

Podstawowe potrzeby: Mam demona Pythona, który wywołuje inny program przez os.system. Moim życzeniem jest być w stanie odpowiednio obsłużyć wyłączenie systemu lub SIGTERM, aby umożliwić wywoływany program wrócić, a następnie wyjść.Jak prawidłowo obsługiwać i zatrzymywać zamknięcie systemu (i SIGTERM), aby zakończyć pracę w języku Python?

Co ja już próbowałem: Próbowałem podejście za pomocą sygnału:

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) 

Wykorzystanie time.sleep nie wydaje się działać, a drugi druk nigdy nazywa.

Przeczytałem kilka słów o atexit.register (handler) zamiast signal.signal (signal.SIGTERM, handler), ale nic nie jest wywoływane przy zabijaniu.

+1

Skopiowałem twój kod i działało dobrze. Jaką wersję Pythona używasz, itp? –

+1

Twój kod wydaje się działać. Jakie są wyniki/zachowania, które otrzymujesz? –

+0

Poczekaj sekundę Zbieram to, czego potrzebujesz. – AsTeR

Odpowiedz

9

Twój kod prawie działa, z wyjątkiem tego, że zapomniałeś wyjść po oczyszczeniu.

Często potrzebujemy przechwytywać różne inne sygnały, takie jak INT, HUP i QUIT, ale nie tyle z demonami.

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) 

W wielu systemach zwykłe procesy nie mają wiele czasu na czyszczenie podczas zamykania. Aby być bezpiecznym, możesz write an init.d script powstrzymać demona i czekać na niego.

+0

Dziękuję za tę interesującą rozwiniętą odpowiedź i prowadzenie do tej dokumentacji skryptów init.d. – AsTeR

Powiązane problemy