Файлы PID зависают для демонов после перезапуска сервера

У меня есть несколько демонов, которые используют файлы PID для предотвращения параллельного выполнения моей программы. Я настроил обработчик сигналов для перехвата SIGTERM и выполнения необходимой очистки, включая файл PID. Это отлично работает, когда я тестирую "kill -s SIGTERM #PID". Однако, когда я перезагружаю сервер, файлы PID все еще остаются, препятствуя запуску демонов. Насколько я понимаю, SIGTERM отправляется всем процессам при завершении работы сервера. Должен ли я перехватить другой сигнал (SIGINT, SIGQUIT?) В моем демоне?


person stinkypyper    schedule 25.01.2010    source источник


Ответы (3)


Используйте flock (или lockf) в вашем pid-файле, если это удастся, вы можете переписать pid-файл и продолжить.

В этом SO-ответе есть хороший пример того, как это делается.

person Hasturkun    schedule 25.01.2010

Это не прямое решение, но было бы неплохо проверить фактический процесс, запущенный с pid в файле pid при запуске, и, если таковой не существует, очистить устаревший файл.

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

person Noufal Ibrahim    schedule 25.01.2010
comment
+1: при сбое питания ни один процесс не будет отправлять никаких сигналов, и у вас будет такой же тип файла PID без соответствующего процесса. Ясно указан лучший тест, чем просто поиск файла PID. - person S.Lott; 25.01.2010
comment
Если pid используется другим процессом, ваш демон будет думать, что он уже запущен, поэтому это не гарантируется. - person stinkypyper; 26.01.2010
comment
вонючка. Вы всегда можете проверить имя процесса, у которого есть pid, и дважды проверить. Это банальное препятствие. - person Noufal Ibrahim; 26.01.2010

Помните, что после отправки SIGTERM всем процессам ядро ​​ждет некоторое время (обычно около 2 или 3 секунд), а затем отправляет SIGKILL. Вы можете найти это в /etc/rc.d/rc0.d/S01halt или аналогичном (может отличаться в зависимости от вашего дистрибутива).

Например, в моей Fedora 11 у вас есть:

action $"Sending all processes the TERM signal..." /sbin/killall5 -15
sleep 2
action $"Sending all processes the KILL signal..."  /sbin/killall5 -9

Так что, если вы недостаточно быстры, либо увеличьте задержку, либо убедитесь, что вы быстрее!

person PierreBdR    schedule 25.01.2010