Припустимо, у нас є такий тривіальний демон, записаний пітоном:
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цього процесу.