Назад | Перейти на главную страницу

Работа с устаревшей проблемой pidfile после жесткого перезапуска убивает мой демон

Я использую Red Hat Linux (RHEL5) на виртуальной машине (VMWare). Я написал демон, который должен работать все время и автоматически запускаться при загрузке.

Прошлой ночью на узле виртуальной машины возникла неустранимая проблема с оборудованием, и виртуальная машина внезапно остановилась. Когда он вернулся, мой демон не запустился, потому что pidfile все еще существовал.

Видимо это называется Синдром устаревшего pidfile но я не уверен, каков наилучший долгосрочный подход к его смягчению. Я думаю, что скрипт запуска в /etc/rc.d* следует удалить pidfile перед запуском демона, но сценарий управления службами в /etc/init.d должен оставаться таким же, чтобы такие вещи, как service mydaemon start не сбивает pidfile.

/etc/rc.d/rc6.d просто есть символическая ссылка на скрипт в /etc/init.d/, так как мне изменить его поведение только при загрузке? Я могу создать дополнительный сценарий с более высоким приоритетом в rc.d dirs, но кажется хакерским. Кто-то также предложил добавить логику типа «если время безотказной работы меньше 1 минуты, удалите pidfile ", но это тоже кажется хакерским.

Есть какие-нибудь мысли, решения или лучшие практики?

Использовать DAEMON Tools и увидеть Управление процессом.

Спасибо за подсказки @Dennis и @coredump.

Я узнал дополнительную информацию, которая помогла мне разгадать тайну.

  1. Мне было интересно, почему все остальные демоны выздоравливают нормально. Оказывается, в /etc/rc.d/rc.sysinit очистить все pid-файлы в /var/run и /var/lock при загрузке.

  2. Я настроил своего демона на размещение его pid-файла в другом месте из-за проблем с SELinux, не позволяющих мне «использовать файлы с потенциально неверной маркировкой».

Поэтому я еще не исправил это из-за проблем с SELinux, но ответ, я думаю, "поместите свой pidfile в /var/run или /var/lock и это сработает в следующий раз "

Сценарий тот же, процесс запуска просто выполняет действие start для сценариев sysvinit.

Почему бы вам не проверить, правильный ли pid в файле pid, и если не удалить его, а создать новый с правильным pid?

РЕДАКТИРОВАТЬ: Вы можете использовать команду grep ps с файлом pid, чтобы узнать, существует ли еще процесс. Или сделайте наоборот. Проверьте сценарии инициализации RedHat, я уверен, что у них есть для этого несколько вспомогательных функций, например pidofproc.