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

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

6 ответов

Решение

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

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

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

#!/bin/bash
while ! <<command>>
do
  sleep 1
  echo "Restarting program..."
done

замещать <<command>> с командой, которую вы хотите выполнить. Процесс должен завершиться с нулевым кодом завершения, чтобы разорвать цикл. В противном случае он перезапускается сценарием.

Вы хотите перезапустить его, только если он умрет? Проблема в том, что он не обрабатывает ситуации, когда он зависает. Так что просто проверить процесс не всегда поможет. Так что если это что-то вроде веб-сервера, вам нужен скрипт, проверяющий его с точки зрения пользователя.

Если вы настроили Nagios Monitoring, вы можете использовать обработчики событий. Это просто сценарии, которые вы пишете, которые будут запускаться при отключении службы, поэтому вы можете иметь такой, который перезапускает что-то вроде Apache, если веб-сайт не работает.

В зависимости от дистрибутива, но мы успешно использовали "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

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

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

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

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

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

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

Другие вопросы по тегам