У меня есть несколько демонов, которые используют файлы PID для предотвращения параллельного выполнения моей программы. Я настроил обработчик сигналов для перехвата SIGTERM и выполнения необходимой очистки, включая файл PID. Это отлично работает, когда я тестирую "kill -s SIGTERM #PID". Однако, когда я перезагружаю сервер, файлы PID все еще остаются, препятствуя запуску демонов. Насколько я понимаю, SIGTERM отправляется всем процессам при завершении работы сервера. Должен ли я перехватить другой сигнал (SIGINT, SIGQUIT?) В моем демоне?
Файлы PID зависают для демонов после перезапуска сервера
Ответы (3)
Используйте flock
(или lockf
) в вашем pid-файле, если это удастся, вы можете переписать pid-файл и продолжить.
В этом 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
Так что, если вы недостаточно быстры, либо увеличьте задержку, либо убедитесь, что вы быстрее!