Автоматический перезапуск сервиса 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


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



2015-07-04T14:57:45
Инструкции