Systemd: создание unit-файла для своего сервиса
Минимальный .service unit для запуска приложения под systemd: Type=simple, ExecStart, перезапуск при падении, проверка.
Как использовать
- Скопируй блок [Unit] и [Service] в /etc/systemd/system/имя.service (или ~/.config/systemd/user/ для user unit).
- Исправь ExecStart на свой бинарник или скрипт; при необходимости укажи User= и WorkingDirectory=.
- Выполни: 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, Бэкенд крон: Битрикс агенты.