Припустимо, у нас є такий тривіальний демон, записаний пітоном:
def mainloop():
while True:
# 1. do
# 2. some
# 3. important
# 4. job
# 5. sleep
mainloop()
і ми демонструємо його, використовуючи start-stop-daemon
який за замовчуванням надсилає SIGTERM
( TERM
) сигнал --stop
.
Припустимо, виконується поточний крок #2
. І саме в цей момент ми посилаємо TERM
сигнал.
Що трапляється, це виконання припиняється негайно.
Я виявив, що я можу обробляти сигнальну подію за допомогою, signal.signal(signal.SIGTERM, handler)
але річ у тому, що вона все-таки перериває поточне виконання і передає керування handler
.
Отже, моє запитання - чи можна не перервати поточне виконання, а обробляти TERM
сигнал окремим потоком (?), Щоб я зміг встановити shutdown_flag = True
так, що mainloop()
мав шанс витончено зупинитися?
signalfd
та маскуючи доставкуSIGTERM
цього процесу.