Как перезапустить исполняемый файл, если он умирает

8

Я ищу способ отслеживать процесс и перезапускать исполняемый файл, если процесс умирает по какой-либо причине. Есть ли в Linux встроенный инструмент, который может это сделать?

рыба фугу
источник
В этом вопросе есть еще несколько ответов и указателей serverfault.com/questions/56526/…
jrg

Ответы:

7

Если он запускается из init, вы можете запустить его из init. Установите действие для процесса «респаун» для уровней запуска, на которых вы хотите процесс.

Киан
источник
Точно так же launchd довольно хорош.
Джереми Л
Айя. Инструменты Daemon также неплохо подходят для такого рода вещей, но, к несчастью, не проходят встроенный тест.
Cian
10

Я уже отвечал на аналогичный вопрос раньше .

В твоем случае:

#!/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
Рамон Пока
источник
2

Почему не простой скрипт bash?

#!/usr/bin/bash
while `true`
do
  xeyes
done

Замените xeyes на программу по вашему выбору.

djhowell
источник
0

Краткий ответ : Нет, ты должен сделать это сам.

Длинный ответ : Вам понадобится родительский процесс, чтобы запустить его, а затем продолжать проверять, что он жив, и перезапускать его при необходимости.

Вы можете использовать что-то вроде daemontoolsуправления этим.

Рори
источник
Короткий ответ: ты совершенно неправ. Длинный ответ: если дистрибутив Linux не имеет inittab, он будет иметь /etc/event.d/ - любой механизм перезапустит процесс, когда он умрет.
Пол Томблин