Главная >> Инструкции >> Автоматический перезапуск сервиса Linux

Автоматический перезапуск сервиса Linux

Иногда сервисы ни с того ни с сего падают и приходиться их вручную восстанавливать. Если для пользователя домашнего компьютера это не критично, потому что если сервис падает во время разработки, то это даже хорошо, можно сразу увидеть что есть проблема. Но на серверах и VPS сервисы должны работать постоянно для обеспечения доступа к веб-сайту или приложению.

В этой инструкции я покажу как настроить автоматический перезапуск сервиса Linux несколькими способами: с помощью скрипта мониторинга периодически запускаемого через cron и в systemd.

Автоматический перезапуск сервиса в systemd

По умолчанию, если ваш сервис будет убит или завершится некорректно, systemd не будет с ним ничего делать. Но можно настроить сервис так, чтобы при падении или даже остановке он автоматически перезапускался. Для этого используется директива Restart, которую надо добавить в секцию Service. Этот параметр может иметь такие значения:

  • on-failure - только если произошла ошибка;
  • on-success - только если процесс сервиса завершился без ошибок;
  • on-abnormal - только если сервис не отвечает;
  • always - перезапускать всегда, когда сервис был остановлен;

 Например, рассмотрим настройку автоматического перезапуска сервиса Apache:

sudo systemctl edit apache2 [Service]
Restart=on-failure
RestartSec=5s

Директива RestartSec указывает сколько ждать перед перезапуском сервиса. Когда завершите сохраните изменения и выполните команду daemon-reload, чтобы перечитать конфигурацию:

sudo systemctl daemon-reload

Затем чтобы проверить что всё работает посмотрите состояние процесса, завершите процесс сигналом kill:

sudo systemctl status apache2 kill -KILL 32091

И снова посмотрите состояние. Процесс будет запущен. Система инициализации автоматически перезапустит его как только он завершится с кодом возврата ошибки. Если вы хотите чтобы процесс перезапускался всегда, необходимо использовать директиву Restart: always. Однако с ней надо быть осторожным, она вовсе не даст вам завершить процесс, даже если будет необходимо. Для того, чтобы процесс, который постоянно падает не перезапускался, можно добавить лимит на количество перезапусков в секцию Service:

sudo systemctl edit apache2 [Service]
StartLimitIntervalSec=500
StartLimitBurst=5
Restart=on-failure
RestartSec=5s

Директивы StartLimitBurst и StartLimitIntervalSec указывают, что надо попытаться перезапустить сервис пять раз, и если он все эти пять раз упадёт, то больше его не трогать. Вторая директива ограничивает время перезапусков сервиса до 500 секунд.

Автоматический перезапуск сервиса с помощью скрипта

Это самый простой и самый надежный способ работающий абсолютно во всех дистрибутивах Linux и не требующий установки дополнительных утилит. Для того же Apache скрипт выглядит следующим образом:

sudo vi /usr/local/bin/apache-monitor.sh #!/bin/bash
ps -A | grep apache2 || systemctl start apache2

Сохраните файл, сделайте его исполняемым:

chmod ugo+x /usr/local/bin/apache-monitor.sh

Теперь добавьте запись в cron для периодического запуска скрипта:

sudo crontab -e */5 * * * * /usr/local/bin/apache-monitor.sh

На этом все, автоматический перезапуск сервисов штука может и немного сложная, но необходимая в серьезных системах.

6 комментариев к “Автоматический перезапуск сервиса Linux”

  1. Если там записано несколько программ, то сложно ими управлять как сервисами (разве что запустить или остановить все одновременно). И, под конец, запуск из него подрывает устойчивость системы от взлома (примеры можно легко найти в поисковике).

    Ответить
    • Если вы про daemontools то управлять сервисами по отдельности можно с помощью утилиты svc, а безопасность это один из минусов программы, но там где нужна более надежная защита, можно использовать скрипты cron, не так удобно, но зато надежно.

      Ответить
  2. Демон cron каждую минуту ищет изменения в файле etc/crontab и каталогах etc/cron.d/ и /var/spool/cron. Если какие-либо изменения будут найдены, они загружаются в память. Таким образом, демон не нуждается в перезапуске при изменении файла crontab.

    http://www.rhd.ru/docs/manuals/enterprise/RHEL-AS-2.1-Manual/custom-guide/cron-task.html

    Ответить
  3. "nano /etc/service/apache/run"
    В пути, очевидно, опечатка. Поскольку до этого создавались каталоги по пути /service/apache, следовательно и скрипт должен лежать по пути /service/apache/run.
    Или я ошибаюсь?

    Ответить
  4. в lubuntu sshd не стартует из-за того что network manager стартует поздней. Если после загрузки системы вручную запустить sshd то все нормально запускается.
    В прошлом решал проблему уходом от network manager.
    Сейчас всеже пытаюсь найти решение.
    Из статьи ни первый ни второй способы не помогли.

    Ответить
  5. По закону подлости, сначала настрочил коммент, а потом обнаружил что какойто из способов всеже заработал. Вобщем вышеописанный sshd стартует просто с оч.большой задержкой. ОС грузится за ~30сек и инет появляется за этим компом за тоже время, а sshd аж через 5мин. Такие дела...

    Ответить

Оставьте комментарий