WantedBy= в неверной секции: автозапуск не работает
Если WantedBy= стоит в секции [Unit], systemd его отбрасывает как незнакомый параметр. Служба при этом работает: её можно запустить вручную, она проходит проверку. Но автозапуска нет, и обнаруживается это только после перезагрузки сервера.
Что это значит
Похожие по написанию параметры живут в разных секциях: Wants= и WantedBy=. Первый в [Unit] означает «эта служба хочет запустить другую». Второй в [Install] означает «эту службу должна хотеть указанная цель». Перепутать их легко, а последствия разные.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Параметр перенесён по памяти в секцию [Unit]
В [Unit] действительно есть похожий по имени
Wants=, поэтому глаз не цепляется за ошибку. systemd в журнале отмечает незнакомый параметр, но эту строку редко читают. -
Служба «включена», но ссылки нет
Если
enableвыполняли до исправления файла, ссылки в каталоге цели не появилось. Состояние может выглядеть как enabled из-за остатков прежних попыток. -
Указана цель, которая не запускается на этой машине
WantedBy=graphical.targetна сервере без графики не даст автозапуска: цель не достигается. Ссылка есть, а служба не поднимается.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщает про незнакомые параметры, включая этот случай.
systemd-analyze verify /etc/systemd/system/myapp.serviceСсылки автозапуска. Отсутствие вашей службы — прямой ответ, почему она не поднимается.
ls -l /etc/systemd/system/multi-user.target.wants/Состояние автозапуска одним словом.
systemctl is-enabled myapp.serviceРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- В [Unit] действительно есть похожий по имени
Wants=, поэтому глаз не цепляется за ошибку. systemd в журнале отмечает незнакомый параметр, но эту строку редко читают.
- Как проверить
-
Посмотрите файл и проверку.
systemctl cat myapp.service | grep -n -B3 WantedBy systemd-analyze verify /etc/systemd/system/myapp.service
- Как исправить
-
Перенесите параметр в [Install], перечитайте конфигурацию и включите службу заново — ссылка автозапуска создаётся именно командой включения.
sudo systemctl daemon-reload && sudo systemctl enable myapp.service
- Почему происходит
- Если
enableвыполняли до исправления файла, ссылки в каталоге цели не появилось. Состояние может выглядеть как enabled из-за остатков прежних попыток.
- Как проверить
-
Проверьте наличие ссылки в каталоге цели.
ls -l /etc/systemd/system/multi-user.target.wants/ | grep myapp systemctl is-enabled myapp.service
- Как исправить
- Выполните включение заново после правки файла и убедитесь, что ссылка появилась.
- Почему происходит
WantedBy=graphical.targetна сервере без графики не даст автозапуска: цель не достигается. Ссылка есть, а служба не поднимается.
- Как проверить
-
Посмотрите цель по умолчанию и достигается ли указанная.
systemctl get-default systemctl is-active multi-user.target graphical.target
- Как исправить
-
Для серверных служб указывайте
multi-user.target.
Пример вывода
Параметр автозапуска стоит в секции [Unit]. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl cat myapp.service
# /etc/systemd/system/myapp.service
[Unit]
Description=My application
After=network.target
WantedBy=multi-user.target
[Service]
ExecStart=/usr/local/bin/myapp
$ sudo systemctl enable myapp.service
The unit files have no installation config (WantedBy=, RequiredBy=, Also=, Alias= settings
in the [Install] section...)
Связанные ошибки
- Unit … has no installation config: не включается автозапуск systemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
- Unit file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
- Warning: The unit file … changed on disk Предупреждение о том, что unit-файл изменился на диске: systemd работает со старой версией. Когда нужен daemon-reload.
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Service has more than one ExecStart= setting Несколько команд запуска допустимы только при Type=oneshot. Как правильно заменить команду в переопределении.
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
Источники
-
systemd.unit(5)
Разделение параметров по секциям [Unit] и [Install]. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено переносом WantedBy= в [Unit]: служба запускается вручную, автозапуска нет.