Как автоматически перезапустить сервис в Linux при сбое

Как автоматически перезапустить сервис в Linux при сбое

Автоматический перезапуск сервиса в Linux можно настроить через systemd: достаточно указать параметры Restart=on-failure и RestartSec=5 в unit-файле. Такой способ подходит, если нужно обеспечить стабильный перезапуск сервиса при сбое Linux без сторонних инструментов.

Linux logo

Чтобы настроить restart сервиса Linux через systemd, достаточно изменить unit-файл и включить параметры автоматического восстановления. Метод подходит для любого случая, где важен контроль и перезапуск службы при сбое в Linux.

Ситуация: на сервере работает важный процесс — например, сайт, база данных или телеграм-бот. И всё хорошо, пока этот процесс не зависает. Иногда — раз в месяц, иногда — каждый день. В результате: клиенты не могут зайти на сайт, база не отвечает, бот молчит.

Решение: настроить автоматический перезапуск сервиса, чтобы при сбое система сама его поднимала заново. Без звонков, без нервов, без ручного «пинка».

Разберём:

  • как работает systemd — это «дирижёр» всех процессов в Linux;
  • как настроить перезапуск при сбое;
  • как вручную проверить, работает ли всё как надо;
  • как написать cron-скрипт на всякий случай.

Аренда VPS/VDS от 219 руб/месяц

Преимущества VPS в AdminVPS:

✓ Бесплатное администрирование

✓ Только быстрые NVMe-диски

✓ Защита от DDoS-атак

✓ Быстрая техподдержка

Аренда VPS/VDS виртуального сервера от AdminVPS — это прозрачная и честная услуга с доступной ценой

Что представляет собой сервис в Linux

Сервис Linux не работает

Сервис в «Линуксе» — это программа, которая работает в фоновом режиме. Например:

  • Apache — обслуживает сайты;
  • MySQL — работает с базой данных;
  • Telegram-бот — сидит на сервере и ждёт команд.

Все эти процессы — «службы» или «демоны» (отсюда и systemd — system daemon). Они не имеют окошек, не просят нажимать кнопки — просто делают свою работу в фоне.

Как понять, что сервис «упал»

Сайт на VPS перестал открываться. Программа, подключающаяся к базе, выдаёт ошибку. Telegram-бот молчит. Обычно мы узнаём об этом от клиентов. Лучше — узнать первым и сделать так, чтобы сервис сам восстанавливался.

Чтобы не полагаться на жалобы пользователей, можно внедрить простую систему мониторинга. Вот несколько способов узнать о проблеме вовремя.

1. Проверка статуса через systemctl. Выполните команду:

systemctl status имя_сервиса

Это позволит увидеть текущее состояние службы.

2. Журнал systemd. Используйте:

 journalctl -u имя_сервиса --since "1 hour ago"

Это поможет узнать, были ли ошибки или аварийные остановки.

3. Пинг до порта или HTTP-запрос. Для веб-серверов и ботов можно настроить curl или netcat:

curl -s http://localhost:порт

или

nc -z localhost порт

Если ответа нет, сервис, скорее всего, «упал».

4. Сторонние инструменты. Используйте сервисы мониторинга, например, Zabbix, или простые bash-скрипты, которые проверяют доступность и записывают ошибки в лог.

Чем раньше вы узнаете о сбое, тем быстрее сможете его устранить — либо вручную, либо с помощью автоматического перезапуска, о котором расскажем далее.

Как устроен автозапуск в Linux

В популярных версиях Linux (Ubuntu, Debian, CentOS, Fedora и др.) основным механизмом запуска и управления службами стал systemd.

Примеры действий в терминале:

sudo systemctl start имя_сервиса     # Запустить вручную
sudo systemctl stop имя_сервиса      # Остановить
sudo systemctl status имя_сервиса    # Проверить статус

Ещё systemd может перезапустить сервис сам, если тот перестал работать. Главное — правильно его настроить.

Если вы не знаете, как называется нужный сервис, выполните:

systemctl list-units --type=service

Или просто начните вводить systemctl status и нажмите Tab — автодополнение покажет доступные варианты.

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

Представим, что на сервере есть нужный нам сервис — назовём его myservice. Его автозапуск в случае остановки можно настроить через встроенную систему systemd.

Необходимо открыть unit-файл. Пример:

sudo nano /etc/systemd/system/myservice.service

Найти его можно, введя:

systemctl cat myservice

Она покажет путь и содержимое unit-файла для выбранного сервиса.

Если unit-файла нет

Иногда бывает, программа, запущенная вручную работает, но systemctl про неё ничего не знает. Значит, что systemd не управляет этим действием. В этой ситуации можно создать свой unit-файл.

Допустим, у нас есть файл /home/user/myscript.sh со скриптом. Тогда вводим:

sudo nano /etc/systemd/system/myscript.service

И вставляем:

[Unit]
Description=Мой сервис
[Service]
ExecStart=/bin/bash /home/user/myscript.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Сохраняем, затем:

sudo systemctl daemon-reload
sudo systemctl enable myscript
sudo systemctl start myscript

Теперь systemd отвечает за запуск и работу этой программы, как и за другие службы в системе. Всё — она стала полноценной «службой».

Добавляем параметры для автозапуска

В файле ищем раздел [Service] — именно туда нужно добавить строки, отвечающие за автоматический перезапуск:

Restart=on-failure
RestartSec=5

Что они делают:

  • Restart=on-failure — говорит системе перезапустить сервис, если тот завершился с ошибкой;
  • RestartSec=5 — даёт системе команду подождать 5 секунд перед повторным запуском.

Важно: эти строки должны быть именно в блоке [Service], а не в [Unit] или [Install]. Если поставить их не туда — ничего работать не будет.

Сохраняем изменения и обновляем systemd.

После того как вы добавили параметры, сохраняем файл и перезапускаем systemd, чтобы он учёл изменения:

sudo systemctl daemon-reload

Включаем сервис и проверяем перезапуск

Введите команды:

sudo systemctl enable myservice
sudo systemctl restart myservice

Проверим, как система поведёт себя, если сервис вдруг завершится с ошибкой. Принудительно «завалим» его командой:

sudo kill -9 $(pidof myservice)

Теперь ждём несколько секунд и проверяем статус:

systemctl status myservice

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

journalctl -u myservice --since "10 minutes ago"

Альтернатива systemd: простой скрипт с cron

Если systemd по какой-то причине не справляется с автоматическим перезапуском сервиса, можно сделать подстраховку. Особенно, если сервис нестабилен или надо проверить, что он точно работает. Создадим инструмент, который следит за состоянием сервиса и в случае сбоя сам его перезапускает. А затем подключим его к cron — встроенному в Linux планировщику заданий.

Создаём файл с инструкцией

Откройте терминал. В домашней папке (или где вам удобно) сделаем новый файл с названием, например:

check_service.sh
nano check_service.sh

Вставляем в него этот код:

#!/bin/bash

SERVICE=myservice
if ! systemctl is-active --quiet $SERVICE
then
  echo "$(date): $SERVICE не работает, перезапускаем..." >> /var/log/service_monitor.log
  systemctl restart $SERVICE
fi

Пояснение:

  • SERVICE=myservice — вместо myservice напишите название своего сервиса (например, nginx, apache2, ssh и т.д.);
  • скрипт проверяет, работает ли сервис. Если он неактивен — пишет об этом в журнал /var/log/service_monitor.log и перезапускает его.

Делаем скрипт исполняемым

Чтобы Linux разрешил запускать этот файл как программу, выполним:

chmod +x check_service.sh

Подключаем через cron

Теперь можно настроить автоматический запуск этой проверки, например, каждые 5 минут.

Открываем планировщик заданий cron:

crontab -e

Если откроется редактор, то выбирайте nano, он самый простой.

В самый конец файла добавьте строку:

*/5 * * * * /полный/путь/к/check_service.sh

Узнать, где находится файл, можно с помощью команды pwd в той папке, где он лежит. Например, если в домашней папке:

/home/username/check_service.sh

И тогда строка в crontab будет выглядеть так:

*/5 * * * * /home/username/check_service.sh

Теперь каждые 5 минут система будет запускать проверочный скрипт. Если сервис «упал», программа его перезапустит — и об этом будет запись в логе.

Убедитесь, что демон cron запущен:

sudo systemctl status cron

Если он остановлен, введите:

sudo systemctl start cron

Что выбрать: systemd или cron

Выбор между systemd и cron зависит от того, насколько надёжную и постоянную работу сервиса вы хотите обеспечить.

Строки с командами Linux

Если сервис критически важен (например, сайт, почтовый сервер, Telegram-бот), используйте systemd. Он встроен в операционную систему, запускается на уровне ядра, обладает гибкими возможностями контроля и восстановления служб. Systemd автоматически отслеживает статус процессов и умеет перезапускать их в случае сбоев без внешних инструментов.

Особенности systemd

Системный менеджер systemd отличает следующее:

  • встроен в большинство современных дистрибутивов Linux;
  • гибкие настройки для перезапуска, зависимостей и задержек;
  • работает на уровне ядра, быстро реагирует на сбои;
  • требует правильного оформления unit-файла.

Если сервис нестабилен или это тестовый проект, можно использовать скрипт + cron как подстраховку. Этот метод проще в настройке: можно следить за состоянием процесса без создания unit-файла. Однако cron проверяет состояние только через заданные интервалы (например, раз в 5 минут), а не моментально, поэтому между падением сервиса и его восстановлением может пройти некоторое время.

Особенности метода с cron и скриптом

  • простая настройка без глубокого понимания systemd;
  • можно использовать для временных решений и тестовых сред;
  • подходит для случаев, когда нет возможности создать полноценный unit-файл;
  • работает с задержкой (проверка только по расписанию, например каждые 5 минут).

Практический совет

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

При желании можно даже комбинировать оба способа: настроить автоперезапуск через systemd и дополнительно поставить проверку через cron для максимально надёжного контроля.

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

VPN на VPS-сервере

Узнайте, как создать собственный VPN на VPS-сервере для защиты ваших конфиденциальных данных!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях