Załóżmy, że mamy taki trywialny demon napisany w pythonie:
def mainloop():
while True:
# 1. do
# 2. some
# 3. important
# 4. job
# 5. sleep
mainloop()
i demonizujemy go, używając start-stop-daemon
domyślnie włączonego sygnału SIGTERM
( TERM
) --stop
.
Załóżmy, że aktualnie wykonywany krok to #2
. I w tej chwili wysyłamy TERM
sygnał.
Dzieje się tak, że wykonanie kończy się natychmiast.
Przekonałem się, że mogę obsłużyć zdarzenie sygnałowe, signal.signal(signal.SIGTERM, handler)
ale chodzi o to, że nadal przerywa ono bieżące wykonanie i przekazuje kontrolę handler
.
Zatem moje pytanie brzmi - czy można nie przerywać bieżącego wykonania, ale obsługiwać TERM
sygnał w oddzielnym wątku (?), Aby móc ustawić shutdown_flag = True
tak, aby mainloop()
miał szansę zatrzymać się z gracją?
signalfd
prosiłeś, wykorzystując i maskując dostawęSIGTERM
do procesu.