Я использую 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.
Я узнал дополнительную информацию, которая помогла мне разгадать тайну.
Мне было интересно, почему все остальные демоны выздоравливают нормально. Оказывается, в /etc/rc.d/rc.sysinit
очистить все pid-файлы в /var/run
и /var/lock
при загрузке.
Я настроил своего демона на размещение его pid-файла в другом месте из-за проблем с SELinux, не позволяющих мне «использовать файлы с потенциально неверной маркировкой».
Поэтому я еще не исправил это из-за проблем с SELinux, но ответ, я думаю, "поместите свой pidfile в /var/run
или /var/lock
и это сработает в следующий раз "
Сценарий тот же, процесс запуска просто выполняет действие start для сценариев sysvinit.
Почему бы вам не проверить, правильный ли pid в файле pid, и если не удалить его, а создать новый с правильным pid?
РЕДАКТИРОВАТЬ: Вы можете использовать команду grep ps с файлом pid, чтобы узнать, существует ли еще процесс. Или сделайте наоборот. Проверьте сценарии инициализации RedHat, я уверен, что у них есть для этого несколько вспомогательных функций, например pidofproc
.