Настройка автоматического перезапуска сервисов с systemd
Настройка автоматического перезапуска сервисов с systemd для восстановления после сбоев, проверки работоспособности и мониторинга в производственных средах.
Содержание
Введение
В производственных средах неизбежны неожиданные сбои сервисов. Правильно настроенные механизмы автоматического перезапуска минимизируют время простоя и повышают надёжность системы.
Шаг 1: Проверка текущего состояния сервиса
# Состояние сервиса
systemctl status service_name
# Журналы сервиса
journalctl -u service_name -n 50
# Количество перезапусков
systemctl show service_name | grep NRestarts
# Все неудавшиеся сервисы
systemctl --failed
Шаг 2: Настройка автоматического перезапуска systemd
[Unit]
Description=Мой сервис
After=network.target
[Service]
Type=simple
User=www-data
ExecStart=/usr/bin/myapp
Restart=always
RestartSec=5
StartLimitIntervalSec=60
StartLimitBurst=5
[Install]
WantedBy=multi-user.target
Параметры перезапуска
| Параметр | Описание |
|---|---|
Restart=no | Без автоперезапуска (по умолчанию) |
Restart=always | Перезапуск во всех случаях |
Restart=on-failure | Перезапуск только при ошибке |
Restart=on-abnormal | Перезапуск при аномальном завершении |
# Перезагрузить и запустить
sudo systemctl daemon-reload
sudo systemctl enable service_name
sudo systemctl start service_name
Шаг 3: Расширенная конфигурация
[Service]
Restart=on-failure
RestartSec=10
# Остановить если падает более 5 раз за 5 минут
StartLimitIntervalSec=300
StartLimitBurst=5
# Лимит памяти
MemoryMax=512M
Шаг 4: Конфигурации для конкретных приложений
Приложение Node.js
[Unit]
Description=Моё приложение Node.js
After=network.target
[Service]
Type=simple
User=nodeuser
WorkingDirectory=/var/www/app
ExecStart=/usr/bin/node /var/www/app/index.js
Restart=always
RestartSec=5
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
Docker-контейнер
# docker-compose.yml
services:
app:
image: myapp
restart: unless-stopped
Шаг 5: Устранение неполадок
# Почему сервис не запускается?
journalctl -u service_name -n 100 --no-pager
# Сбросить счётчик ошибок
systemctl reset-failed service_name
При достижении StartLimitBurst systemd прекращает автоперезапуск. Используйте systemctl reset-failed service_name для сброса счётчика.
Заключение
Настройка автоматического перезапуска systemd значительно повышает надёжность сервисов в производственной среде. Используйте Restart=always или Restart=on-failure для базовой настройки, установите интервал перезапуска с RestartSec и предотвратите бесконечные циклы с StartLimitBurst.
Связанные статьи
Проблема SSH-подключения: не могу подключиться к серверу
Руководство по решению проблем SSH-подключения: правила файрвола Path.net, Default Block, создание правила фильтрации для SSH-порта и шаги по устранению неполадок.
Проблема RDP-подключения: не могу подключиться к Windows Server
Руководство по решению проблем RDP-подключения: правила файрвола Path.net, Default Block, создание правила фильтрации для порта RDP и шаги по устранению неполадок.
Как провести MTR-тест и отправить результаты в поддержку
Руководство по сетевому тестированию с помощью WinMTR и Linux MTR, создание правила фильтрации ICMP и отправка результатов в службу поддержки. Диагностика потери пакетов.