Короткий ответ
After/Before задают только порядок запуска относительно другого юнита, не создавая зависимости по факту успеха; Requires создаёт жёсткую зависимость — если требуемый юнит не запустился или упал, текущий юнит тоже останавливается; Wants создаёт мягкую зависимость — пытается запустить требуемый юнit, но продолжает работу, даже если тот не стартовал.
Как это работает подробнее
systemd строит граф зависимостей на основе всех этих директив и параллельно запускает независимые ветки юнитов, соблюдая порядок там, где он явно задан; важно помнить, что сама по себе директива Requires без After не гарантирует порядок запуска — она гарантирует только то, что оба юнита будут активны (или оба остановлены при сбое), а не последовательность их старта.
Пример кода
example.txt
[Unit]
Description=My Application
After=network-online.target postgresql.service
Wants=network-online.target
Requires=postgresql.service
[Service]
ExecStart=/usr/bin/myappЧто использовать на практике
- Практика. для сервиса, зависящего от базы данных на том же хосте, типично сочетание After=postgresql.service и Wants=postgresql.service (мягкая зависимость с порядком, не роняющая сервис, если БД временно недоступна при старте) либо Requires=postgresql.service, если без БД сервис действительно бессмысленно запускать.
Подводные камни
- Риск. Частая ошибка — указать только Requires без After, ожидая, что systemd сам определит правильный порядок запуска, и получить состояние гонки (race condition), когда зависимый сервис стартует раньше своей зависимости.