Цель не достигнута: служба ждёт target, который не наступает
Цели (.target) — это точки синхронизации, а не программы. Если служба ждёт цель, которая на этой машине не достигается, она не запустится вовсе и без явной ошибки. Самые частые случаи: graphical.target на сервере и network-online.target без службы ожидания сети.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Указана графическая цель на сервере без графики
WantedBy=graphical.targetилиAfter=graphical.targetна сервере не выполняются: цель по умолчанию — multi-user. -
network-online.targetне достигаетсяЭта цель достигается службой ожидания сети (
systemd-networkd-wait-onlineилиNetworkManager-wait-online). Если она не включена, цель пассивна и ничего не гарантирует. -
Цель указана с опечаткой
Имя без расширения или с ошибкой превращается в несуществующий unit. Зависимость от него не выполняется никогда.
-
Собственная цель не включена
Свои цели тоже нужно включать или тянуть зависимостью. Иначе они остаются неактивными.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Все достигнутые цели на машине.
systemctl list-units --type=target --no-pagerЦель по умолчанию: от неё зависит, что вообще запускается при загрузке.
systemctl get-defaultДерево зависимостей: видно, какой цели служба ждёт.
systemctl list-dependencies myapp.service --no-pager | head -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
WantedBy=graphical.targetилиAfter=graphical.targetна сервере не выполняются: цель по умолчанию — multi-user.
- Как проверить
-
Посмотрите цель по умолчанию и состояния целей.
systemctl get-default systemctl is-active graphical.target multi-user.target
- Как исправить
-
Замените на
multi-user.target— стандартную цель для серверных служб.
network-online.target не достигается- Почему происходит
- Эта цель достигается службой ожидания сети (
systemd-networkd-wait-onlineилиNetworkManager-wait-online). Если она не включена, цель пассивна и ничего не гарантирует.
- Как проверить
-
Посмотрите состояние службы ожидания.
systemctl status systemd-networkd-wait-online.service NetworkManager-wait-online.service --no-pager | head -14
- Как исправить
-
Включите соответствующую службу ожидания сети. Без неё указание цели бессмысленно.
sudo systemctl enable systemd-networkd-wait-online.service
- Почему происходит
- Имя без расширения или с ошибкой превращается в несуществующий unit. Зависимость от него не выполняется никогда.
- Как проверить
-
Посмотрите зависимости службы.
systemctl show myapp.service -p After -p Requires -p Wants | tr " " "\n" | grep target
- Как исправить
-
Исправьте имя цели полностью, с расширением
.target.
- Почему происходит
- Свои цели тоже нужно включать или тянуть зависимостью. Иначе они остаются неактивными.
- Как проверить
-
Посмотрите состояние цели.
systemctl status mystack.target --no-pager | head -6
- Как исправить
- Включите цель или объявите, что её требует другой unit.
Пример вывода
Служба привязана к графической цели на сервере. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl get-default
multi-user.target
$ systemctl is-active graphical.target
inactive
$ systemctl status myapp.service --no-pager | head -5
○ myapp.service - My application
Loaded: loaded (/etc/systemd/system/myapp.service; enabled; preset: enabled)
Active: inactive (dead)
Связанные ошибки
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- WantedBy= в неверной секции: автозапуск не работает Параметр WantedBy= указан в [Unit] вместо [Install]. Служба запускается вручную, но не поднимается после перезагрузки.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
- Замаскированная зависимость мешает загрузке Служба не запускается, потому что замаскирован unit, который она требует. Как найти все замаскированные unit.
- Контейнеры не поднимаются при загрузке сервера Контейнеры с политикой перезапуска не стартуют после перезагрузки: docker не включён, тома на неподмонтированном разделе, своя служба без зависимостей.
- Своя цель не запускает свои службы Создали цель для группы служб, а они не поднимаются: нет связей со стороны цели или цель не включена.
- Система загружается не в то состояние После загрузки нет служб или нет графики: цель по умолчанию указывает не туда. Как посмотреть и переключить.
Источники
-
systemd.special(7)
Описание стандартных целей: multi-user, graphical, network, network-online. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на сервере с WantedBy=graphical.target: служба не поднимается после перезагрузки.