Что означает ошибка "systemctl: юнит не найден"
Ошибка Failed to start unit: Unit not found (или просто Unit <имя> not found.) возникает, когда команда systemctl не может обнаружить указанный вами юнит (службу, таймер, сокет и т.д.) в каталогах, где systemd ищет конфигурационные файлы.
Симптомы:
$ sudo systemctl start myapp.service
Failed to start myapp.service: Unit myapp.service not found.
Или:
$ sudo systemctl enable nginx
The unit files have no [Install] section. They cannot be enabled.
(Вторая ошибка — частый "родственник", когда файл есть, но в нём нет секции [Install] для enable).
Эта ошибка не означает, что служба сломанная. Она означает, что systemd вообще не знает о существовании такого юнита в данный момент.
Причины возникновения
- Неправильное или неполное имя юнита. Вы указали
nginx, а systemd ищетnginx.service. Или опечатались в имени (ngnix.service). - Файл службы (.service) отсутствует в системе. Вы пытаетесь управлять службой, которая никогда не была установлена или была удалена.
- Файл службы существует, но systemd не знает о нём. Файл
.serviceлежит в/etc/systemd/system/или/usr/lib/systemd/system/, но после его создания или копирования вы не выполнилиsystemctl daemon-reload. - Юнит имеет другой тип. Вы пытаетесь запустить
mytimer.timerкомандойsystemctl start mytimer(без.timer), а systemd по умолчанию предполагает тип.service. - Повреждённый или некорректный файл юнита. Файл существует, но имеет синтаксические ошибки, из-за чего systemd отказывается его загружать (часто сопровождается другой ошибкой, но может и маскироваться под "not found").
Способы решения
Способ 1: Проверьте и найдите правильное имя юнита
Это первый и самый важный шаг. Systemd очень чувствителен к именам.
- Получите полный список всех загруженных юнитов:
systemctl list-units --type=service --all
Флаг--allпокажет даже неактивные (незапущенные) службы. - Или получите список всех доступных файлов служб (даже тех, что не загружены):
systemctl list-unit-files --type=service
Этот команда показывает, какие службы systemd знает и может управлять ими. - Используйте поиск, если не помните точное имя:
systemctl list-unit-files --type=service | grep -i <часть_имени> # Пример: ищем всё, что связано с nginx systemctl list-unit-files --type=service | grep -i nginx
Результат может быть:nginx.service enabled
Правильное имя для команд —nginx.service. - Если службы в списке нет — значит, systemd не обнаруживает соответствующий
.serviceфайл в стандартных каталогах (/etc/systemd/system/,/usr/lib/systemd/system/). Переходите к Способу 3.
⚠️ Важно: Всегда используйте полное имя с расширением (
.service,.timer,.socket) для однозначности, особенно в скриптах.
Способ 2: Перезагрузите конфигурацию systemd (daemon-reload)
Если вы только что создали, скопировали или отредактировали файл службы (.service), systemd не знает об этих изменениях, пока вы явно не прикажете ему перечитать конфигурации.
- Выполните команду:
sudo systemctl daemon-reload
Эта команда заставляет менеджер systemd просканировать каталоги с юнитами заново и загрузить новые/изменённые конфигурации. - После этого попробуйте снова запустить или включить службу:
sudo systemctl start <имя_службы>.service sudo systemctl enable <имя_службы>.service # для автозапуска
Способ 3: Создайте или восстановите файл службы
Если после поиска (Способ 1) вы не нашли нужную службу, её файл отсутствует в системе.
- Определите, где должен лежать файл. Обычно:
/etc/systemd/system/— для административных конфигураций и кастомных служб./usr/lib/systemd/system/— для служб, поставляемых пакетами (управляемых пакетным менеджером).
- Создайте базовый файл службы. Например, для простого старта скрипта
/opt/myapp/start.sh:sudo nano /etc/systemd/system/myapp.service
Вставьте минимальный шаблон:[Unit] Description=My Custom Application After=network.target [Service] Type=simple ExecStart=/opt/myapp/start.sh Restart=on-failure [Install] WantedBy=multi-user.target
Сохраните и закройте редактор. - Установите правильные права:
sudo chmod 644 /etc/systemd/system/myapp.service - Перезагрузите демон (Способ 2) и затем включите службу:
sudo systemctl daemon-reload sudo systemctl enable myapp.service sudo systemctl start myapp.service - Проверьте статус:
sudo systemctl status myapp.service
Способ 4: Проверьте целостность и синтаксис файла
Если файл службы есть, но systemctl упорно его не видит, возможно, в нём критическая синтаксическая ошибка.
- Проверьте файл на ошибки:
sudo systemd-analyze verify /etc/systemd/system/<имя_службы>.service
Если вывод пустой — синтаксис в порядке. Если есть ошибки, команда покажет строку и описание проблемы. - Проверьте, что файл не является символьной ссылкой в никуда:
ls -l /etc/systemd/system/<имя_службы>.service
Убедитесь, что ссылка (если это ссылка) ведёт на существующий файл в/usr/lib/systemd/system/. - Проверьте права на файл: systemd обычно требует, чтобы файлы служб принадлежали
rootи имели права644(чтение для всех, запись для владельца).
Профилактика
- Всегда используйте
systemctl daemon-reloadпосле любого ручного создания, копирования или редактирования файлов.service,.timer,.socket. - Указывайте полное имя юнита (с
.service) в скриптах и при автоматизации, чтобы избежать неоднозначностей. - Устанавливайте службы через пакетный менеджер (
apt install nginx,dnf install httpd), когда это возможно. Пакеты автоматически размещают файлы в правильных каталогах и выполняютdaemon-reload. - Проверяйте синтаксис нового файла службы через
systemd-analyze verifyперед попыткой его загрузить. - Храните кастомные файлы служб в
/etc/systemd/system/, а не в/usr/lib/systemd/system/, чтобы они не перезаписывались при обновлении пакетов.
# Быстрая чек-лист при появлении ошибки:
# 1. systemctl list-unit-files --type=service | grep <имя>
# 2. Если нет файла -> создать (Способ 3)
# 3. Если файл есть -> sudo systemctl daemon-reload
# 4. sudo systemctl start <полное_имя>.service