скрученный на Python и SIGKILL

У меня есть приложение python, использующее витую структуру.

Я использую значение, хранящееся в файле pid, созданном twistd. Сценарий запуска проверяет его присутствие и не запускает процесс-демон, если pid-файл уже существует.

Однако twistd не удаляет файл .pid, когда получает сигнал SIGKILL. Это заставляет сценарий запуска думать, что демон уже запущен.

Я понимаю, что правильным способом остановки демона было бы использование сигнала SIGTERM, но проблема в том, что когда пользователь, запустивший демон, выходит из системы, демон никогда не получает сигнал SIGTERM, поэтому очевидно, что он убит с помощью SIGKILL. Это означает, что как только пользователь выйдет из системы, он никогда не сможет снова запустить демон, потому что pid-файл все еще существует.

Есть ли способ заставить этот файл исчезнуть в таких ситуациях?


person rafalcieslak    schedule 09.11.2012    source источник


Ответы (2)


На странице руководства signal(2):

Сигналы SIGKILL и SIGSTOP не могут быть пойманы или проигнорированы.

Таким образом, процесс не может запускать какой-либо код очистки в ответ на этот сигнал. Обычно вы используете SIGKILL только для завершения процесса, который не завершается в ответ на SIGTERM (который может быть обнаружен).

person James Henstridge    schedule 09.11.2012
comment
Спасибо за ответ, это кажется вполне логичным. Тем не менее, это заставляет меня задаться вопросом, почему - когда пользователь выходит из системы - этому скрученному демону не отправляется SIGTERM, вместо этого используется SIGKILL? - person rafalcieslak; 09.11.2012
comment
@ Жан-Поль Калдероне: Если быть точным, мой демон twistd запускается как служба dbus. Я читал, что dbus завершает работу всех служб при завершении работы, но вместо этого мой демон twistd получает SIGKILL. - person rafalcieslak; 13.11.2012

Вы можете изменить свою программу запуска (или обернуть ее другой программой запуска) и удалить файл pid, прежде чем пытаться перезапустить twistd.

person Mihai    schedule 09.11.2012
comment
Это то, чем я занимаюсь сейчас. Если файл присутствует, но демон не отвечает, программа запуска пытается убить указанный pid, а затем я удаляю файл. Однако невозможно определить, запущен ли демон (например, завис) или он был убит, поскольку в обоих случаях присутствует pidfile. И дело в том, что если он был убит (возможно, даже в предыдущем сеансе), я не смогу попытаться убить этот pid, потому что это может быть совершенно другой новый процесс. - person rafalcieslak; 09.11.2012