Co Python robi domyślnie pod osłonami, jeśli otrzymuje SIGTERM, ale nie ma zarejestrowanej obsługi sygnału?Python: Jaka jest domyślna obsługa SIGTERM?
Odpowiedz
Nic. Sam Python nie rejestruje dla niego procedury obsługi sygnału. Można to sprawdzić w interaktywnym tłumacza:
>>> import signal
>>> signal.signal(signal.SIGTERM, signal.SIG_DFL)
0
>>> signal.SIG_DFL
0
To pokazuje signal.signal()
powrocie signal.SIG_DFL dla signal.SIGTERM
. Kontrast to signal.SIGINT
, który ma obsługi sygnału domyślny (co podnosi KeyboardInterrupt
):
>>> signal.signal(signal.SIGINT, signal.SIG_DFL)
<built-in function default_int_handler>
budynek na odpowiedź Thomas Wouters, pyton nie zarejestrować obsługi dla sygnału SIGTERM. Możemy to zobaczyć:
In[23]: signal.SIG_DFL == signal.signal(signal.SIGTERM,signal.SIG_DFL)
Out[23]: True
Oznacza to, że system podejmie domyślną akcję. W systemie Linux domyślną akcją (zgodnie z the signal man page) dla SIGTERM jest zakończenie procesu.
Zakończenie procesu oznacza, że:
proces po prostu nie przeznacza żadnych więcej plasterków czas, w którym może on wykonywać kod.
- To oznacza, że nie podniesie wyjątek, lub zadzwoń kod w try: koniec: bloki lub wyjście metoda menedżerów kontekście. Nie zrobi tych rzeczy, ponieważ ten konkretny interpreter pytonów nigdy nie będzie miał szansy na wykonanie innej instrukcji.
Pamięć procesowa i inne zasoby (otwarte pliki, gniazda sieciowe itp.) Zostaną zwrócone z powrotem do reszty systemu.
To jest tak prawdziwe, ważne i - przynajmniej dla mnie - nieintuicyjne. Sądziłem, że cała sprawa klauzul końcowych i \ __ exit__ metod menedżerów kontekstu miała na celu sprawdzenie, czy dany kod jest zawsze uruchamiany (z wyjątkiem SIGKILL, o którym wiedziałem, że jest obsługiwany na poziomie systemu). Walczyłem z tym kilka dni i dopiero teraz uświadomiłem sobie, że już tu przedstawiłeś swoją odpowiedź. Muszę o tym pamiętać. – matlehmann
Oznacza to również, że funkcje zarejestrowane za pomocą 'atexit.register()' nie będą wywoływane, jeśli proces zostanie zakończony przez 'SIGTERM'. –
Dobrze, ale co to znaczy? Wyjść nieczysto? Zignorować to całkowicie? Coś innego? – Lucretiel