systemd-сервисы: unit, status, restart и зависимости

Systemd unit описывает, как запускать процесс, какие зависимости учитывать и что считать успешным состоянием. Команда systemctl управляет unit через manager; ручной запуск того…

Systemd unit описывает, как запускать процесс, какие зависимости учитывать и что считать успешным состоянием. Команда systemctl управляет unit через manager; ручной запуск того же бинарника не воспроизводит пользователя, окружение, рабочий каталог и ограничения service.

Читать effective-конфигурацию

systemctl cat example.service
systemctl show example.service \
  --property=LoadState,ActiveState,SubState,MainPID,User,Group,FragmentPath
systemctl status example.service --no-pager

cat объединяет основной fragment и drop-ins в порядке применения. show даёт машинно читаемые свойства, status — краткий снимок и последние logs. Ошибка Unit not found требует проверить точное имя и LoadState, а не создавать новый файл наугад.

Start и enable — разные операции

start пытается запустить unit сейчас. enable создаёт связи для запуска при достижении target в будущем, но обычно не стартует немедленно. Составная команда enable --now делает оба действия явно.

После изменения unit-файла нужен daemon-reload, чтобы manager перечитал определения. Он не перезапускает service. Restart уже влияет на процесс и должен выполняться только после проверки конфигурации и окна изменения.

sudo systemctl daemon-reload
sudo systemctl try-restart example.service
systemctl is-active example.service
systemctl is-enabled example.service

try-restart не запускает неактивный unit; обычный restart запустит. Выбор зависит от намерения deployment.

Type и готовность

Для Type=simple процесс считается started после запуска ExecStart, но приложение ещё может не слушать порт. Type=notify позволяет приложению сообщить readiness. Restart= управляет повтором после определённых завершений; бесконечный crash loop ограничивается StartLimit и должен оставлять понятный status.

Dependencies After/Requires/Wants описывают порядок и отношения, но After не ждёт прикладную готовность БД. Для этого нужны protocol-aware retry/readiness внутри системы.

Ошибка и диагностика

При failed unit сначала получите systemctl status, show ExecMainStatus/Result и journal текущего запуска. Код 203/EXEC указывает на невозможность выполнить ExecStart: путь, permission, shebang или sandbox. Не добавляйте root и широкие права до проверки User, WorkingDirectory, EnvironmentFile и доступности каждого path.

Практика

Выберите безопасный существующий unit только для чтения. Через cat и show найдите fragment, user, MainPID, restart policy и зависимости. Сопоставьте MainPID с ps и listener, если он сетевой. Составьте порядок проверки изменения unit без фактического restart.

Что важно запомнить

Источники