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

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

3 ответа

Решение

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

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

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

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

Помните, что после отправки 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

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

Другие вопросы по тегам