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


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 на программу по вашему выбору.


0

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

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

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


Короткий ответ: ты совершенно неправ. Длинный ответ: если дистрибутив Linux не имеет inittab, он будет иметь /etc/event.d/ - любой механизм перезапустит процесс, когда он умрет.
— Пол Томблин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.