BASH
#bash#linux#systemd#service#devops

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

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

Как использовать

  1. Скопируй блок [Unit] и [Service] в /etc/systemd/system/имя.service (или ~/.config/systemd/user/ для user unit).
  2. Исправь ExecStart на свой бинарник или скрипт; при необходимости укажи User= и WorkingDirectory=.
  3. Выполни: sudo systemctl daemon-reload && sudo systemctl enable --now имя.service && systemctl status имя.service.

Свой демон или скрипт нужно запускать при загрузке сервера и перезапускать при падении. Без 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, Бэкенд крон: Битрикс агенты.