Unit-файл лежит не в том каталоге
systemd ищет unit-файлы в трёх каталогах с разным приоритетом: ваши файлы в /etc/systemd/system, временные в /run/systemd/system, файлы пакетов в /usr/lib/systemd/system. Файл в любом другом месте не будет найден, а правка файла пакета исчезнет при обновлении.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Файл положен не в каталог поиска
Частые ошибки: /etc/systemd (без system), домашний каталог, /usr/lib/systemd/user для системной службы.
-
Правка внесена в файл пакета
Файл в /usr/lib/systemd/system принадлежит пакету: обновление заменит его, и правка исчезнет без предупреждения.
-
Файл системной службы положен в каталог служб пользователя
Каталоги для системных служб и служб пользователя разные. Файл в каталоге пользователя системный менеджер не увидит.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Полный список каталогов поиска в порядке приоритета.
systemctl show --property=UnitPath | tr " " "\n"Путь к действующему файлу.
systemctl cat myapp.service | head -3Где файл лежит фактически.
sudo find /etc /usr/lib /run -name "myapp*" 2>/dev/nullРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Частые ошибки: /etc/systemd (без system), домашний каталог, /usr/lib/systemd/user для системной службы.
- Как проверить
-
Посмотрите каталоги поиска и найдите файл.
systemctl show --property=UnitPath | tr " " "\n" | head sudo find / -name "myapp.service" -not -path "*/proc/*" 2>/dev/null
- Как исправить
- Перенесите файл в /etc/systemd/system и перечитайте конфигурацию.
- Почему происходит
- Файл в /usr/lib/systemd/system принадлежит пакету: обновление заменит его, и правка исчезнет без предупреждения.
- Как проверить
-
Посмотрите, откуда взят действующий файл.
systemctl cat myapp.service | head -3
- Как исправить
-
Правьте через переопределение (
systemctl edit) либо скопируйте файл в /etc/systemd/system и правьте копию.
- Почему происходит
- Каталоги для системных служб и служб пользователя разные. Файл в каталоге пользователя системный менеджер не увидит.
- Как проверить
-
Посмотрите оба менеджера.
systemctl list-unit-files "myapp*" systemctl --user list-unit-files "myapp*" 2>/dev/null
- Как исправить
- Определите, чья это служба: системная идёт в /etc/systemd/system, пользователя — в ~/.config/systemd/user.
Пример вывода
Файл положен в /etc/systemd вместо /etc/systemd/system. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl start myapp.service
Failed to start myapp.service: Unit myapp.service not found.
$ sudo find /etc -name "myapp.service"
/etc/systemd/myapp.service
Связанные ошибки
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
- Warning: The unit file … changed on disk Предупреждение о том, что unit-файл изменился на диске: systemd работает со старой версией. Когда нужен daemon-reload.
- Переопределение через drop-in не применяется Правка через systemctl edit или файл в каталоге .d не действует: разбор причин, включая особенность списочных параметров и ExecStart.
- 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 file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
Источники
-
systemd.unit(5)
Каталоги поиска unit-файлов и их приоритет. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено: файл в /etc/systemd не находится, в /etc/systemd/system находится.