Инженерные заметки
Linux

Как устроены службы systemd

Что происходит при запуске service: unit-файлы, зависимости, перезапуск и диагностика.

· 7 мин чтения

Что такое unit

systemd управляет не только процессами, но и любыми ресурсами системы, описанными как unit: службами (.service), таймерами (.timer), точками монтирования (.mount), сокетами (.socket).

Unit-файлы лежат в /usr/lib/systemd/system/ (поставляются пакетами) и /etc/systemd/system/ (ваши настройки). Файлы в /etc имеют приоритет, поэтому пакетные юниты не редактируют напрямую.

Подсказка. Для правки пакетной службы используйте systemctl edit имя.service: изменения попадут в drop-in каталог и переживут обновление пакета.

Минимальный service

Простая служба состоит из трёх секций: что это, как запускать, когда включать.

ini
[Unit]
Description=Мой фоновый сервис
After=network-online.target
Wants=network-online.target

[Service] Type=simple User=app ExecStart=/opt/app/bin/server --config /etc/app/config.yml Restart=on-failure RestartSec=3

[Install] WantedBy=multi-user.target

After= задаёт порядок запуска, Wants= создаёт мягкую зависимость. Это разные вещи: порядок без зависимости не запустит нужный unit.

Запуск и автозагрузка

После создания файла systemd нужно сказать, что конфигурация изменилась.

bash
sudo systemctl daemon-reload
sudo systemctl enable --now app.service
systemctl status app.service

enable лишь создаёт символическую ссылку для автозапуска, start запускает сейчас. Флаг --now делает оба действия.

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

Политика Restart= определяет, когда systemd перезапустит процесс. on-failure перезапускает при ненулевом коде выхода или аварийном завершении, always — при любом завершении.

Внимание. Бесконечный перезапуск ломающейся службы скрывает проблему. Ограничивайте его через StartLimitIntervalSec и StartLimitBurst и смотрите в журнал.

Диагностика

Первым делом смотрим статус и последние строки журнала, затем — полный журнал только этой службы.

bash
systemctl status app.service
journalctl -u app.service -b --no-pager | tail -50
systemd-analyze verify /etc/systemd/system/app.service

Частые коды: 203/EXEC — не найден или не исполняется файл из ExecStart, 217/USER — указанного пользователя нет, 200/CHDIR — неверный WorkingDirectory.

Вывод

Служба systemd — это декларативное описание процесса. Пишите минимальный unit, проверяйте его через systemd-analyze verify, меняйте по одному параметру и читайте журнал службы. Так диагностика занимает минуты, а не часы.

Связанные статьи

Автоматизация

systemd timers вместо cron

Как запускать задачи по расписанию с журналом, зависимостями и ограничениями.

10.11.20266 минЧитать