PID файлы зависают для демонов после перезапуска сервера - PullRequest
3 голосов
/ 25 января 2010

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

Ответы [ 3 ]

3 голосов
/ 25 января 2010

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

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

3 голосов
/ 25 января 2010

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

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

2 голосов
/ 25 января 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

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

...