Создание systemd unit для автоперезапуска сервиса
Условие
Вам необходимо создать systemd unit-файл для сервиса, который:
- Запускает скрипт
/opt/myapp/start.sh - Автоматически перезапускается при сбое (crash)
- Ограничивает количество попыток перезапуска до 5 за 60 секунд
- Запускается после network.target
- Логирует вывод в journald
Требования
- Напишите полный unit-файл
- Объясните назначение каждой секции
- Покажите команды для установки, включения и проверки статуса сервиса
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
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