Изящное завершение программы на Python с помощью супервизора

Я пишу программу на Python, которую я буду запускать с помощью супервизора. В основном программа делает следующее:

if __name__ == "__main__":
    while True:
        run()

где функция запуска выполняет простую задачу получения чего-либо из базы данных (mysqlDB) и отправки этого по электронной почте.

Я хочу написать программу так, чтобы при использовании

supervisorctl stop program

соединение mysql должно закрыться, и будет выполнен правильный журнал для завершения работы.

Могу ли я каким-либо образом обработать команду остановки в моем скрипте Python.


person Siddharth Gupta    schedule 19.10.2015    source источник
comment
Вам нужно будет перехватить сигнал, отправленный супервизором docs.python.org/2/library/ сигнал.html   -  person Tymoteusz Paul    schedule 19.10.2015
comment
Где/как я могу захватить эти сигналы?   -  person Siddharth Gupta    schedule 19.10.2015
comment
Я включил ссылку в свой ответ, а еще есть Google, в котором есть все ответы!   -  person Tymoteusz Paul    schedule 21.10.2015


Ответы (1)


Вы можете использовать сигнальное устройство для получения сигналов от ОС, что и будет делать супервизор. Пример кода ниже НЕ тестировался. Вообще.

import signal

keep_going = True

def my_shutdown_handler(signum, frame):
    # set a flag to exit your loop or call what you need to exit gracefully
    keep_going = False

if __name__ == "__main__":
    signal.signal(signal.SIGTERM, my_shutdown_handler) 
    while keep_going:
        run()

Смотрите больше и гораздо более чистые примеры здесь:

Как изящно обработать сигнал SIGTERM?

person Eric G    schedule 20.12.2019