Как правильно обрабатывать и сохранять выключение системы (и SIGTERM), чтобы завершить свою работу в Python? - PullRequest
6 голосов
/ 23 декабря 2011

Базовая потребность: У меня есть демон Python, который вызывает другую программу через os.system. Мое желание состоит в том, чтобы иметь возможность правильно обрабатывать завершение работы системы или SIGTERM, чтобы позволить вызываемой программе вернуться, а затем выйти.

Что я уже пробовал: Я пробовал подход с использованием сигнала:

import signal, time

def handler(signum = None, frame = None):
    print 'Signal handler called with signal', signum
    time.sleep(3)
    #here check if process is done
    print 'Wait done'

signal.signal(signal.SIGTERM , handler)

while True:
    time.sleep(6)

Использование time.sleep не работает, и вторая печать никогда не вызывается.

Я прочитал несколько слов об atexit.register (обработчик) вместо signal.signal (signal.SIGTERM, обработчик), но при вызове kill ничего не вызывается.

1 Ответ

9 голосов
/ 08 августа 2012

Ваш код почти работает, кроме того, что вы забыли выйти после очистки.

Нам часто нужно ловить различные другие сигналы, такие как INT, HUP и QUIT, но не так много для демонов.

import sys, signal, time

def handler(signum = None, frame = None):
    print 'Signal handler called with signal', signum
    time.sleep(1)  #here check if process is done
    print 'Wait done'
    sys.exit(0)

for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]:
    signal.signal(sig, handler)

while True:
    time.sleep(6)

Во многих системах обычные процессы не имеют много времени для очистки во время выключения. Чтобы быть в безопасности, вы можете написать скрипт init.d , чтобы остановить вашего демона и дождаться его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...