Как перезапустить исполняемый файл, если он умирает
8
Я ищу способ отслеживать процесс и перезапускать исполняемый файл, если процесс умирает по какой-либо причине. Есть ли в Linux встроенный инструмент, который может это сделать?
Если он запускается из init, вы можете запустить его из init. Установите действие для процесса «респаун» для уровней запуска, на которых вы хотите процесс.
#!/bin/bash
while ! <<command>>
do
sleep 1
echo "Restarting program..."
done
Замените <<command>>на команду, которую вы хотите выполнить. Процесс должен завершиться с нулевым кодом завершения, чтобы разорвать цикл. В противном случае он перезапускается сценарием.
Ницца. Это также работает с ksh, и я бы изменил «echo» на команду «logger», чтобы поместить сообщение в системные журналы.
Мэй
Прекрасный ответ.
Арунджит RS
4
Вы хотите перезапустить его, только если он умрет? Проблема в том, что он не обрабатывает ситуации, когда он зависает. Так что просто проверить процесс не всегда поможет. Так что если это что-то вроде веб-сервера, вам нужен скрипт, проверяющий его с точки зрения пользователя.
Если вы настроили Nagios Monitoring, вы можете использовать обработчики событий . Это просто сценарии, которые вы пишете, которые будут запускаться при отключении службы, поэтому вы можете иметь такой, который перезапускает что-то вроде Apache, если веб-сайт не работает.
+1, убедитесь, что вы также освещаете ситуации, в которых он также намеренно убит.
Максимус Минимус
Хорошая мысль, хотя в моем случае процесс просто исчезает
pufferfish
3
В зависимости от дистрибутива, но мы успешно использовали «monit» для этой задачи. Это довольно легко. Вы можете написать свои чеки, контролировать PID процесса и т. Д.
Пример файла monitrc:
check process sshd with pidfile /var/run/sshd.pid
start program "/etc/init.d/ssh start"
stop program "/etc/init.d/ssh stop"
if failed port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout
Длинный ответ : Вам понадобится родительский процесс, чтобы запустить его, а затем продолжать проверять, что он жив, и перезапускать его при необходимости.
Вы можете использовать что-то вроде daemontoolsуправления этим.
Короткий ответ: ты совершенно неправ. Длинный ответ: если дистрибутив Linux не имеет inittab, он будет иметь /etc/event.d/ - любой механизм перезапустит процесс, когда он умрет.
Ответы:
Если он запускается из init, вы можете запустить его из init. Установите действие для процесса «респаун» для уровней запуска, на которых вы хотите процесс.
источник
Я уже отвечал на аналогичный вопрос раньше .
В твоем случае:
Замените
<<command>>
на команду, которую вы хотите выполнить. Процесс должен завершиться с нулевым кодом завершения, чтобы разорвать цикл. В противном случае он перезапускается сценарием.источник
Вы хотите перезапустить его, только если он умрет? Проблема в том, что он не обрабатывает ситуации, когда он зависает. Так что просто проверить процесс не всегда поможет. Так что если это что-то вроде веб-сервера, вам нужен скрипт, проверяющий его с точки зрения пользователя.
Если вы настроили Nagios Monitoring, вы можете использовать обработчики событий . Это просто сценарии, которые вы пишете, которые будут запускаться при отключении службы, поэтому вы можете иметь такой, который перезапускает что-то вроде Apache, если веб-сайт не работает.
источник
В зависимости от дистрибутива, но мы успешно использовали «monit» для этой задачи. Это довольно легко. Вы можете написать свои чеки, контролировать PID процесса и т. Д.
Пример файла monitrc:
источник
Почему не простой скрипт bash?
Замените xeyes на программу по вашему выбору.
источник
Краткий ответ : Нет, ты должен сделать это сам.
Длинный ответ : Вам понадобится родительский процесс, чтобы запустить его, а затем продолжать проверять, что он жив, и перезапускать его при необходимости.
Вы можете использовать что-то вроде
daemontools
управления этим.источник