Вопрос или проблема
Служба существует и успешно найдена через команду статуса
>sudo systemd status my-service
● my-service.service - Описание моей службы
Загружено: загружено (/usr/lib/systemd/system/my-service.service; статически; предустановка поставщика: отключена)
Активно: неактивно (мертво)
однако, в следующей команде:
>sudo systemctl start my-service
Не удалось запустить my-service.service: Единица не найдена.
У меня абсолютно нет идеи, где искать. Ничего не изменилось между командами, они дают одинаковый результат даже если выполнять их вместе через bash-скрипт или соединять с помощью ;
Хотя проблема возникла давно, стоит отметить это для будущих справок:
В дополнение к проверке того, существует ли файл службы, вам также нужно проверить содержимое файла службы. В частности, обратите внимание на зависимости, такие как “Requires=” и “After=”. Если в этих утверждениях есть ошибки, вы все равно получите ошибку “Единица не найдена”, но она просто укажет, что вашу службу нельзя найти, вместо того, чтобы указать на отсутствующую единицу зависимости.
Для меня проблемными были следующие строки:
Requires=network-online.service
After=network-online.service
Они были скопированы с какого-то так называемого учебного сайта, и было очевидно, что вместо них следует использовать network-online.target. Тем не менее, я потратил три часа своей жизни, пытаясь найти решение из-за этого.
Ответ или решение
Проблема, с которой вы столкнулись, может быть вызвана несколькими факторами, которые стоит тщательно проверить. Ваше сообщение о том, что сервис существует и его можно увидеть с помощью команды status
, но команда start
говорит о том, что юнит не найден, указывает на возможные несоответствия в конфигурации системного юнита.
1. Проверка наличия файла юнита
Первым делом, убедитесь, что файл юнита действительно находится в одной из ожидаемых директорий. Обычно файлы системных юнитов располагаются в следующих папках:
/lib/systemd/system/
— для системных сервисов./etc/systemd/system/
— для пользовательских сервисов, которые переопределяют те, что вlib
.
2. Корректность содержимого файла юнита
Проверьте содержимое самого файла юнита на наличие ошибок, особенно в тех местах, которые могут зависеть от других юнитов. Ваша строка с использованием Requires=
и After=
может быть неправильной.
Например, если в вашем файле юнита указаны зависимости:
Requires=network-online.service
After=network-online.service
Эти строки могут привести к проблемам, если network-online.service
не существует на вашей системе. В большинстве случаев, правильным значением будет network-online.target
. Это может быть причиной, по которой система не может найти нужный юнит, так как она ищет несуществующий файл.
3. Проверка синтаксиса и перезапуск демона
После внесения изменений в файл юнита, не забудьте выполнить команду для перезагрузки конфигураций системного демона:
sudo systemctl daemon-reload
4. Журнал системы
Если после проверки всех вышеуказанных пунктов проблема все еще сохраняется, стоит просмотреть системные журналы для получения дополнительной информации:
journalctl -xe
Это может помочь выявить ошибки в конфигурации или других юнитах, которые могут блокировать запуск вашего сервиса.
5. Рекомендации
- Внимательно читайте документацию по systemd, так как неправильные зависимости могут не только блокировать запуск вашего сервиса, но и влиять на другие компоненты системы.
- Если вы используете примеры из иностранных источников, будьте внимательны — они могут не учитывать специфику системы или окружения, в котором вы работаете.
Заключение
Проблема "Unit not found" в системах на основе systemd может возникнуть по множеству причин. Тщательная проверка наличия файлов юнитов, корректности их содержимого и зависимостей, а также использование инструментов для диагностики системного журнала помогут вам быстро найти и устранить проблему. Надеюсь, данные рекомендации помогут вам или другим пользователям, которые столкнутся с аналогичными проблемами в будущем.