SystemdDoctor
мешает работе зависимости частое

Служба не запускается вместе с зависимостью

Порядок и необходимость в systemd задаются разными параметрами. After= только выстраивает очередь, но никого не запускает. Если зависимость не поднята, служба стартует без неё — и падает на первом обращении.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Указан только порядок

    After=postgresql.service без Wants= или Requires= не запускает базу. Если она не в автозапуске, приложение стартует раньше и не находит её.

  2. Зависимость не включена в автозапуск

    Даже при Wants= служба запустится вместе с вашей только при обращении. Если её не включили, при загрузке она может не подняться первой.

  3. Приложение не умеет ждать

    Даже правильные зависимости не гарантируют, что база успела принять соединения: она может быть активной и ещё не готовой.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Что именно объявлено в unit-файле.

systemctl show myapp.service -p After -p Wants -p Requires

Дерево зависимостей с состояниями.

systemctl list-dependencies myapp.service --no-pager | head -20

Порядок событий при загрузке: кто когда стартовал.

journalctl -b -u myapp.service -u postgresql.service --no-pager | head -30

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Указан только порядок
Почему происходит
After=postgresql.service без Wants= или Requires= не запускает базу. Если она не в автозапуске, приложение стартует раньше и не находит её.
Как проверить
Посмотрите зависимости службы.
systemctl show myapp.service -p After -p Wants -p Requires
Как исправить
Добавьте Wants= (мягкая) или Requires= (жёсткая) вместе с After=.
[Unit]
Wants=postgresql.service
After=postgresql.service
2. Зависимость не включена в автозапуск
Почему происходит
Даже при Wants= служба запустится вместе с вашей только при обращении. Если её не включили, при загрузке она может не подняться первой.
Как проверить
Посмотрите состояние включения зависимости.
systemctl is-enabled postgresql.service
Как исправить
Включите зависимость в автозапуск: это надёжнее, чем полагаться на мягкую связь.
3. Приложение не умеет ждать
Почему происходит
Даже правильные зависимости не гарантируют, что база успела принять соединения: она может быть активной и ещё не готовой.
Как проверить
Посмотрите, что делает приложение при недоступной зависимости.
journalctl -u myapp.service -b --no-pager | head -20
Как исправить
Добавьте в приложение повторные попытки подключения и Restart=on-failure с паузой. Это устойчивее любых зависимостей.

Пример вывода

Порядок объявлен, необходимость — нет. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

$ systemctl show myapp.service -p After -p Wants -p Requires
After=postgresql.service systemd-journald.socket basic.target sysinit.target
Wants=
Requires=

$ journalctl -b -u myapp.service | head -3
myapp[1200]: fatal: dial tcp 127.0.0.1:5432: connect: connection refused

Связанные ошибки

Где встречается чаще всего

Источники

  • systemd.unit(5)
    After=, Wants=, Requires= и разница между порядком и требованием.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено связкой приложения и базы без Wants=.
    собственная проверка, systemd 255
    сверено 15 сентября 2026