Что значит ошибка "unit not found" в systemd?
Ошибка Failed to start <имя_службы>.service: Unit not found. (или просто Unit <имя> not found.) возникает, когда демон systemd не может найти конфигурационный файл (юнит) с указанным вами именем в своих каталогах. Systemd ищет файлы служб (с расширением .service) в стандартных путях, таких как /etc/systemd/system/ (администраторские переопределения) и /usr/lib/systemd/system/ (пакетные файлы).
Типичный полный текст ошибки:
$ sudo systemctl start myapp.service
Failed to start myapp.service: Unit not found.
Эта ошибка возникает при попытке start, stop, restart, enable или disable службы, которую systemd не знает.
Основные причины ошибки
- Неправильное имя службы. Вы указали имя, не соответствующее имени файла (например,
systemctl start nginxвместоsystemctl start nginx.service, или с опечаткой). - Файл службы отсутствует в каталогах systemd. Файл
.serviceфизически не находится в/etc/systemd/system/или/usr/lib/systemd/system/. - Система не перечитала конфигурации. Вы создали или скопировали файл службы, но не выполнили
systemctl daemon-reload. Systemd работает со статическим кэшем при запуске. - Неправильное расположение файла. Файл лежит не в каталоге, который systemd сканирует (например, в
/root/или/home/user/). - Повреждённый или некорректный файл службы. Файл существует, но имеет синтаксические ошибки или отсутствуют обязательные секции (хотя это чаще вызывает другие ошибки при загрузке).
- Конфликт имён. Существует несколько файлов с одинаковым именем в разных каталогах, и systemd выбирает не тот (реже).
Способы решения ошибки "unit not found"
Способ 1: Проверьте точное имя и найдите юнит
Перед всем убедитесь, что вы используете правильное имя. Systemd часто может добавить .service автоматически, но лучше явно указывать.
- Поиск существующих служб. Выполните команду для поиска по части имени:
systemctl list-unit-files --type=service --all | grep -i <часть_имени_службы>
Флаг--allпоказывает также отключённые и неактивные юниты. Пример:systemctl list-unit-files --type=service --all | grep -i nginx
Вывод:nginx.service enabled
Если ничего не выводится, служба с таким именем не зарегистрирована в systemd. - Попробуйте полный путь. Если вы знаете, где лежит файл, укажите его абсолютный путь:
sudo systemctl start /etc/systemd/system/myapp.service
Способ 2: Перезагрузите демон systemd (daemon-reload)
Это самая частая причина и решение после создания нового файла службы.
- После создания или копирования файла
.serviceв/etc/systemd/system/выполните:sudo systemctl daemon-reload
Эта команда заставляет systemd перечитать все конфигурационные файлы из стандартных каталогов и обновить свой внутренний менеджер юнитов. - После этого повторите команду запуска/включения:
sudo systemctl start myapp.service # или sudo systemctl enable myapp.service
Способ 3: Убедитесь, что файл службы существует и имеет правильное имя
- Проверьте наличие файла. Перейдите в каталоги systemd и найдите ваш файл:
ls -l /etc/systemd/system/*.service ls -l /usr/lib/systemd/system/*.service
Файл должен существовать в одном из этих каталогов (или их подкаталогах). Обычно административные службы кладут в/etc/systemd/system/. - Проверьте имя файла. Имя файла должно заканчиваться на
.serviceи в командеsystemctlвы используете это имя без пути, но с расширением (или без — systemd добавит).- Правильно:
sudo systemctl start myapp.serviceдля файлаmyapp.service. - Неправильно:
sudo systemctl start myapp(если нет другого юнита с таким именем) илиsudo systemctl start myapp.(с точкой).
- Правильно:
Способ 4: Создайте корректный файл службы
Если службы действительно нет, её нужно создать.
- Создайте файл в
/etc/systemd/system/(требуются права root):sudo nano /etc/systemd/system/myapp.service - Добавьте минимальную рабочую конфигурацию. Замените
/usr/bin/myappна реальный путь к исполняемому файлу вашего приложения.[Unit] Description=My Custom Application After=network.target [Service] Type=simple ExecStart=/usr/bin/myapp --config /etc/myapp/config.conf Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target[Unit]— метаданные и зависимости.[Service]— как запускать процесс.[Install]— как включить (символические ссылки дляenable).
- Сохраните файл и выполните Способ 2 (
daemon-reload), а затем Способ 1 (проверьте имя) и запустите:sudo systemctl daemon-reload sudo systemctl start myapp.service sudo systemctl enable myapp.service # для автозапуска
Способ 5: Проверьте синтаксис и права файла
Иногда systemd может "не видеть" файл из-за проблем с правами или синтаксисом.
- Проверьте синтаксис. Systemd может проверить конфиг без загрузки:
sudo systemd-analyze verify /etc/systemd/system/myapp.service
Если вывод пуст — синтаксис корректен. При ошибках он укажет строку и проблему. - Проверьте права. Файл должен быть доступен для чтения root:
ls -l /etc/systemd/system/myapp.service
Ожидаемый вывод:-rw-r--r-- 1 root root ... myapp.service. Если права другие, исправьте:sudo chmod 644 /etc/systemd/system/myapp.service sudo chown root:root /etc/systemd/system/myapp.service
Профилактика ошибки "unit not found"
- Всегда выполняйте
systemctl daemon-reloadпосле любого создания, удаления или изменения файлов служб в/etc/systemd/system/или/usr/lib/systemd/system/. - Используйте стандартные пути. Не храните файлы
.serviceв случайных каталогах. Только/etc/systemd/system/(для локальных настроек) и/usr/lib/systemd/system/(для пакетов). - Соблюдайте соглашение об именах. Имя файла должно быть осмысленным и заканчиваться на
.service. Избегайте пробелов и спецсимволов в имени. - Проверяйте конфигурацию перед загрузкой. Используйте
systemd-analyze verifyдля проверки синтаксиса нового файла. - Используйте
systemctl statusдля диагностики. Если служба "установлена" (enable), но не запускается, командаsudo systemctl status myapp.serviceпокажет её текущее состояние и последние логи, что поможет выявить другие проблемы (например,permission deniedилиfailed to start).