Перейти к основному содержимому
Вернуться в категорию

Настройка автоматического перезапуска сервисов с systemd

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

Время чтения: 11 мин Устранение неполадок
systemdсервисавтоперезапускwatchdoglinuxuptimeнадёжность

Содержание

Введение

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

Шаг 1: Проверка текущего состояния сервиса

hljs bash
# Состояние сервиса
systemctl status service_name

# Журналы сервиса
journalctl -u service_name -n 50

# Количество перезапусков
systemctl show service_name | grep NRestarts

# Все неудавшиеся сервисы
systemctl --failed

Шаг 2: Настройка автоматического перезапуска systemd

hljs ini
[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Перезапуск при аномальном завершении
hljs bash
# Перезагрузить и запустить
sudo systemctl daemon-reload
sudo systemctl enable service_name
sudo systemctl start service_name

Шаг 3: Расширенная конфигурация

hljs ini
[Service]
Restart=on-failure
RestartSec=10
# Остановить если падает более 5 раз за 5 минут
StartLimitIntervalSec=300
StartLimitBurst=5
# Лимит памяти
MemoryMax=512M

Шаг 4: Конфигурации для конкретных приложений

Приложение Node.js

hljs ini
[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-контейнер

hljs yaml
# docker-compose.yml
services:
  app:
    image: myapp
    restart: unless-stopped

Шаг 5: Устранение неполадок

hljs bash
# Почему сервис не запускается?
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.