Unit … not found: unit-файл не найден
Сообщение вида Failed to start myapp.service: Unit myapp.service not found значит, что systemd не знает такого unit. Файл либо лежит не там, где его ищут, либо создан только что и ещё не прочитан, либо в имени опечатка.
Что это значит
systemd ищет unit-файлы в нескольких каталогах по порядку: /etc/systemd/system (ваши файлы и переопределения), /run/systemd/system (временные), /usr/lib/systemd/system (файлы пакетов). Файл, положенный в любое другое место, не будет найден.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Файл создан, но systemd о нём ещё не знает
Список unit кешируется. Пока не выполнена перезагрузка конфигурации, новый файл для systemd не существует.
-
Файл лежит не в том каталоге
Частая ошибка — положить unit в /etc/systemd (без system), в домашний каталог или в /lib/systemd/user. systemd такие файлы не подхватит.
-
Не указано расширение или в имени опечатка
Без расширения systemd достраивает
.service, но в зависимостях и в шаблонах это работает не всегда. Имя с точкой внутри тоже часто трактуют неверно. -
Файл — символическая ссылка в никуда
Ссылка осталась после удаления пакета или перемещения файла. systemd считает такой unit несуществующим.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает, знает ли systemd про этот unit и в каком он состоянии.
systemctl list-unit-files | grep -i myappЕсли unit найден, печатает его содержимое с путём. Если нет — честно сообщает об отсутствии.
systemctl cat myapp.serviceИщет файл по всем каталогам, где systemd мог бы его искать.
sudo find /etc/systemd /usr/lib/systemd /run/systemd -name "*myapp*" 2>/dev/nullРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Список unit кешируется. Пока не выполнена перезагрузка конфигурации, новый файл для systemd не существует.
- Как проверить
-
Проверьте, видит ли systemd файл.
systemctl list-unit-files | grep myapp ls -l /etc/systemd/system/myapp.service
- Как исправить
-
Перечитайте конфигурацию и запустите службу.
sudo systemctl daemon-reload && sudo systemctl start myapp.service
- Почему происходит
- Частая ошибка — положить unit в /etc/systemd (без system), в домашний каталог или в /lib/systemd/user. systemd такие файлы не подхватит.
- Как проверить
-
Посмотрите, где systemd вообще ищет unit-файлы.
systemd-analyze --system unit-paths 2>/dev/null || systemctl show --property=UnitPath | tr " " "\n" | head
- Как исправить
-
Перенесите файл в /etc/systemd/system и выполните перезагрузку конфигурации.
sudo mv myapp.service /etc/systemd/system/ && sudo systemctl daemon-reload
- Почему происходит
- Без расширения systemd достраивает
.service, но в зависимостях и в шаблонах это работает не всегда. Имя с точкой внутри тоже часто трактуют неверно.
- Как проверить
-
Посмотрите точное имя файла и то, что вы вводите.
systemctl list-unit-files "*myapp*"
- Как исправить
-
Используйте полное имя с расширением. Если unit шаблонный, имя должно включать экземпляр:
myapp@prod.service.
- Почему происходит
- Ссылка осталась после удаления пакета или перемещения файла. systemd считает такой unit несуществующим.
- Как проверить
-
Проверьте ссылки в каталогах автозапуска.
sudo find /etc/systemd/system -xtype l -name "*myapp*"
- Как исправить
-
Удалите битые ссылки и перечитайте конфигурацию.
sudo find /etc/systemd/system -xtype l -delete && sudo systemctl daemon-reload
Пример вывода
Unit создан, но конфигурация не перечитана. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl start myapp.service
Failed to start myapp.service: Unit myapp.service not found.
systemd[1]: myapp.service: Unit not found.
Связанные ошибки
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Warning: The unit file … changed on disk Предупреждение о том, что unit-файл изменился на диске: systemd работает со старой версией. Когда нужен daemon-reload.
- Unit file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
- 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 … has no installation config: не включается автозапуск systemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
- Unit-файл лежит не в том каталоге Каталоги поиска unit-файлов и их приоритет. Почему файл в /lib перезаписывается обновлением, а в /etc — нет.
Источники
-
systemd.unit(5)
Каталоги поиска unit-файлов и порядок их обхода. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено созданием unit без daemon-reload и файлом в /etc/systemd.