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

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

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

Время чтения: 11 мин Устранение неполадок
systemdсервисавтоперезапускwatchdoglinuxuptimeнадёжность
Автор
REXE Teknoloji Network & Security Team
Редактор
REXE Teknoloji Technical Editorial
Первая публикация
Последнее обновление

Введение

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

Шаг 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.

Часто задаваемые вопросы

В чём разница между Restart=always и Restart=on-failure?

'always' перезапускает сервис во всех случаях. 'on-failure' перезапускает только при ненулевом коде выхода или убийстве сигналом. Для производственных сервисов обычно предпочтительнее 'on-failure'.

Сервис постоянно перезапускается, но не работает. Что делать?

Сначала проверьте журналы ошибок с помощью 'journalctl -u service_name -n 100'. Проблема обычно в отсутствующей зависимости, неправильной конфигурации или проблеме с правами доступа.

Как установить политику перезапуска для Docker-контейнеров?

В docker-compose.yml 'restart: unless-stopped' — наиболее распространённый вариант. 'on-failure:5' перезапускает максимум 5 раз.

Как получать уведомления при сбое сервиса?

Директива OnFailure в systemd может запускать сервис уведомлений при сбое. Инструменты мониторинга, такие как Uptime Kuma, также могут отслеживать состояние сервисов и отправлять уведомления.

Связанные статьи

Сетевой трафикВходящий GbpsИсходящий Gbps