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

Чтобы настроить restart сервиса Linux через systemd, достаточно изменить unit-файл и включить параметры автоматического восстановления. Метод подходит для любого случая, где важен контроль и перезапуск службы при сбое в Linux.
Ситуация: на сервере работает важный процесс — например, сайт, база данных или телеграм-бот. И всё хорошо, пока этот процесс не зависает. Иногда — раз в месяц, иногда — каждый день. В результате: клиенты не могут зайти на сайт, база не отвечает, бот молчит.
Решение: настроить автоматический перезапуск сервиса, чтобы при сбое система сама его поднимала заново. Без звонков, без нервов, без ручного «пинка».
Разберём:
- как работает systemd — это «дирижёр» всех процессов в Linux;
- как настроить перезапуск при сбое;
- как вручную проверить, работает ли всё как надо;
- как написать cron-скрипт на всякий случай.
Что представляет собой сервис в 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 зависит от того, насколько надёжную и постоянную работу сервиса вы хотите обеспечить.

Если сервис критически важен (например, сайт, почтовый сервер, Telegram-бот), используйте systemd. Он встроен в операционную систему, запускается на уровне ядра, обладает гибкими возможностями контроля и восстановления служб. Systemd автоматически отслеживает статус процессов и умеет перезапускать их в случае сбоев без внешних инструментов.
Особенности systemd
Системный менеджер systemd отличает следующее:
- встроен в большинство современных дистрибутивов Linux;
- гибкие настройки для перезапуска, зависимостей и задержек;
- работает на уровне ядра, быстро реагирует на сбои;
- требует правильного оформления unit-файла.
Если сервис нестабилен или это тестовый проект, можно использовать скрипт + cron как подстраховку. Этот метод проще в настройке: можно следить за состоянием процесса без создания unit-файла. Однако cron проверяет состояние только через заданные интервалы (например, раз в 5 минут), а не моментально, поэтому между падением сервиса и его восстановлением может пройти некоторое время.
Особенности метода с cron и скриптом
- простая настройка без глубокого понимания systemd;
- можно использовать для временных решений и тестовых сред;
- подходит для случаев, когда нет возможности создать полноценный unit-файл;
- работает с задержкой (проверка только по расписанию, например каждые 5 минут).
Практический совет
Для серверов с постоянной нагрузкой и критическими процессами — настройте перезапуск через systemd. Для вспомогательных скриптов, экспериментов и временных решений — добавьте проверку через cron в качестве дополнительной страховки.
При желании можно даже комбинировать оба способа: настроить автоперезапуск через systemd и дополнительно поставить проверку через cron для максимально надёжного контроля.
Читайте в блоге:
- Пересылка журналов Apache в OpenSearch через Logstash
- Как защитить Apache с помощью Let's Encrypt в Ubuntu 20.04 и 22.04
- Как включить и настроить удалённый доступ к серверу