Не дай сервису упасть: настраиваем автоперезапуск в Linux
Представьте: ваш веб-сайт лежит, а вы даже не знаете об этом. Сервис на сервере тихо "умер" посреди ночи, и клиенты уже не могут получить доступ к вашему приложению. Знакомая ситуация?
На рабочих серверах и VPS такое просто недопустимо. Ручной перезапуск — это потеря времени и нервов, особенно когда проблема возникает снова и снова.
Мы покажем вам, как раз и навсегда решить эту проблему. Вы научитесь настраивать автоматический перезапуск сервисов в Linux, чтобы система сама следила за их состоянием и мгновенно восстанавливала работу.
Вы освоите два надежных способа. Первый — встроенные возможности systemd, которые позволяют гибко настраивать политики перезапуска. Узнаете, как заставить систему перезапускать сервис только при ошибках или всегда, как выставить задержку перед перезапуском и даже ограничить количество попыток, чтобы не зациклить падающий процесс.
Второй способ — универсальный скрипт, который работает в любом дистрибутиве. Простая, но мощная команда, которую можно запускать по расписанию через cron. Этот метод не требует глубоких знаний системы и при этом невероятно эффективен.
Готовы забыть о ручном восстановлении сервисов и сделать вашу инфраструктуру по-настоящему отказоустойчивой? Переходите к статье — ваши серверы скажут вам спасибо!
Иногда сервисы ни с того ни с сего падают и приходиться их вручную восстанавливать. Если для пользователя домашнего компьютера это не критично, потому что если сервис падает во время разработки, то это даже хорошо, можно сразу увидеть что есть проблема. Но на серверах и 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
На этом все, автоматический перезапуск сервисов штука может и немного сложная, но необходимая в серьезных системах.