Сниппеты
Назад к сниппетам

Systemd: создание unit-файла для своего сервиса

Минимальный .service unit для запуска приложения под systemd: Type=simple, ExecStart, перезапуск при падении, проверка.

bash
24 февраля 2026 г.

Свой демон или скрипт нужно запускать при загрузке сервера и перезапускать при падении. Без systemd unit сервис не поднимается после перезагрузки или падает без автоперезапуска. Проблема: как описать сервис в формате systemd, где хранить unit и как проверить. Ниже — минимальный unit-файл с Type=simple, автоперезапуском и команды проверки.

Решение

Минимальный unit для долгоживущего процесса (приложение, воркер, бот).

[Unit]
Description=My application service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/myapp --config /etc/myapp/config.yaml
Restart=on-failure
RestartSec=5
User=appuser
Group=appuser
WorkingDirectory=/var/lib/myapp

[Install]
WantedBy=multi-user.target
  • Description — краткое описание сервиса (для systemctl status).
  • After=network-online.target — старт после поднятия сети (если сервису нужен сетевой доступ).
  • Type=simple — процесс, который systemd считает «запущенным», как только выполнился ExecStart (подходит для обычных демонов).
  • ExecStart — одна команда запуска; путь к бинарнику или скрипту полный.
  • Restart=on-failure — перезапуск при ненулевом коде выхода или падении.
  • RestartSec=5 — пауза перед перезапуском (секунды).
  • User/Group — от чьего имени запускать (без root, если не нужны привилегии).
  • WorkingDirectory — рабочая директория процесса.
  • WantedBy=multi-user.target — включить в автозагрузку при загрузке в multi-user.

Установка и включение

sudo cp myapp.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
sudo systemctl status myapp.service

Проверка

systemctl is-active myapp.service   # active
journalctl -u myapp.service -f      # логи в реальном времени

Типичные ошибки

  • ExecStart с аргументами — вся команда в одну строку; для сложной логики используйте скрипт в ExecStart.
  • Путь к бинарнику — указывайте полный путь (/usr/bin/... или /opt/...); PATH в unit ограничен.
  • Права на файл — unit в /etc/systemd/system/ должен быть читаемым (например 644).

Связанные сниппеты: Systemd timer как замена cron, Бэкенд крон: Битрикс агенты.

Systemd: создание unit-файла для своего сервиса | Viku-Lov Studio