← Назад к вопросам

Создание systemd unit для автоперезапуска сервиса

1.8 Middle🔥 211 комментариев
#Linux и администрирование

Условие

Вам необходимо создать systemd unit-файл для сервиса, который:

  1. Запускает скрипт /opt/myapp/start.sh
  2. Автоматически перезапускается при сбое (crash)
  3. Ограничивает количество попыток перезапуска до 5 за 60 секунд
  4. Запускается после network.target
  5. Логирует вывод в journald

Требования

  • Напишите полный unit-файл
  • Объясните назначение каждой секции
  • Покажите команды для установки, включения и проверки статуса сервиса

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

1. Systemd Unit-файл

[Unit]
Description=My Application Service
After=network.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/opt/myapp/start.sh
Restart=on-failure
RestartMaxRetries=5
RestartSec=10s
StartLimitInterval=60
StartLimitBurst=5

StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

User=myapp
WorkingDirectory=/opt/myapp

[Install]
WantedBy=multi-user.target

2. Назначение каждой секции

Секция [Unit]

Description — краткое описание сервиса, видимое в статусе и логах.

After=network.target — сервис запустится ПОСЛЕ инициализации сетевого стека. Это критично для сервисов, которым нужна сеть.

Wants=network-online.target — дополнительная зависимость для максимально надежной работы сети (особенно при использовании DHCP).

Секция [Service]

Type=simple — стандартный тип для большинства приложений. systemd не ожидает никаких сигналов о завершении инициализации.

ExecStart=/opt/myapp/start.sh — команда запуска. Должна быть абсолютный путь. Скрипт должен быть выполняемым (chmod +x).

Restart=on-failure — перезапускать только при ошибке (код выхода != 0 или сигнал). При systemctl stop не перезапускается.

RestartMaxRetries=5 — максимум 5 попыток перезапуска в течение интервала StartLimitInterval.

RestartSec=10s — интервал 10 секунд между попытками перезапуска (отсчет начинается с момента падения сервиса).

StartLimitInterval=60 — временное окно в 60 секунд, в течение которого считаются попытки перезапуска.

StartLimitBurst=5 — в окне из 60 секунд разрешено максимум 5 стартов. После превышения лимита сервис перейдет в состояние failed и больше не будет перезапускаться автоматически.

StandardOutput=journal и StandardError=journal — вся информация из stdout и stderr будет логирована в systemd журнал (journald). Это позволяет просматривать логи через journalctl.

SyslogIdentifier=myapp — префикс в журнале для идентификации логов этого сервиса.

User=myapp и WorkingDirectory=/opt/myapp — сервис запускается от пользователя myapp (необходимо создать) в директории /opt/myapp. Это повышает безопасность.

Секция [Install]

WantedBy=multi-user.target — сервис будет автоматически запускаться при загрузке системы (применяется при systemctl enable).

3. Установка и управление сервисом

Создание пользователя (если не существует)

sudo useradd -r -s /bin/false -d /opt/myapp myapp

Создание unit-файла

sudo nano /etc/systemd/system/myapp.service
# Скопировать содержимое unit-файла выше

Установка прав на скрипт

sudo chown myapp:myapp /opt/myapp/start.sh
sudo chmod +x /opt/myapp/start.sh
sudo chown -R myapp:myapp /opt/myapp

Перезагрузка конфигурации systemd

sudo systemctl daemon-reload

Эта команда обязательна после создания или изменения unit-файлов.

Включение сервиса при загрузке

sudo systemctl enable myapp.service

Запуск сервиса

sudo systemctl start myapp.service

Проверка статуса

sudo systemctl status myapp.service

Выведет текущее состояние, последние логи и информацию о процессе.

Просмотр журнала сервиса

journalctl -u myapp.service -f

Флаг -f (follow) отслеживает новые логи в реальном времени.

Просмотр логов за последний час

journalctl -u myapp.service --since "1 hour ago"

Остановка сервиса

sudo systemctl stop myapp.service

Перезагрузка конфигурации сервиса

sudo systemctl reload myapp.service

Это отправляет сигнал SIGHUP процессу (если приложение его поддерживает).

Перезапуск сервиса

sudo systemctl restart myapp.service

Это stop + start.

4. Проверка ограничений и перезапусков

Просмотр истории перезапусков

journalctl -u myapp.service | grep -i restart

Проверка достижения лимита перезапусков

sudo systemctl status myapp.service | grep -i "start limit"

Если сервис достиг лимита, статус покажет: State: failed (Result: start-limit-hit)

Сброс счетчика перезапусков

sudo systemctl reset-failed myapp.service

Это позволяет вновь стартовать сервис после превышения лимита.

5. Рекомендации

  • Тестирование: Убедитесь, что скрипт /opt/myapp/start.sh работает корректно при запуске от пользователя myapp.
  • Graceful shutdown: Убедитесь, что приложение корректно обрабатывает сигнал SIGTERM для чистого завершения.
  • Healthchecks: Рассмотрите добавление Type=notify или ExecHealthCheck для более надежного мониторинга.
  • Логирование: Проверяйте логи регулярно: journalctl -u myapp.service -p err
Создание systemd unit для автоперезапуска сервиса | PrepBro