Operation refused, unit may be requested by dependency only
Сообщение «Operation refused, unit … may be requested by dependency only» означает, что в unit-файле стоит RefuseManualStart=yes. Такой unit запускается только как зависимость другого — обычно это служебная часть большей системы, которую нельзя запускать в отрыве.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Unit помечен как запускаемый только по зависимости
Так поступают с вспомогательными unit: они предполагают, что перед ними что-то подготовлено. Ручной запуск в обход подготовки оставил бы систему в странном состоянии.
-
Запрет унаследован от чужого шаблона unit-файла
Параметр скопировали из примера, не поняв смысла. Тогда запрет мешает без пользы.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Прямо показывает, стоит ли запрет.
systemctl show myapp.service -p RefuseManualStart -p RefuseManualStopКто тянет этот unit: его и надо запускать.
systemctl list-dependencies --reverse myapp.service --no-pager | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Так поступают с вспомогательными unit: они предполагают, что перед ними что-то подготовлено. Ручной запуск в обход подготовки оставил бы систему в странном состоянии.
- Как проверить
-
Посмотрите параметр и то, кто зависит от этого unit.
systemctl show myapp-helper.service -p RefuseManualStart -p RefuseManualStop systemctl list-dependencies --reverse myapp-helper.service --no-pager
- Как исправить
- Запускайте тот unit, который тянет вспомогательный: обычно это основная служба или цель. Так подготовка выполнится по порядку.
- Почему происходит
- Параметр скопировали из примера, не поняв смысла. Тогда запрет мешает без пользы.
- Как проверить
-
Посмотрите, ваш ли это файл и есть ли у него смысл быть зависимым.
systemctl cat myapp.service | grep -i refusemanual
- Как исправить
- Уберите параметр, если служба должна запускаться вручную. Ставить его стоит только осознанно.
Пример вывода
Ручной запуск служебного unit отклонён. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl start myapp-helper.service
Failed to start myapp-helper.service: Operation refused, unit myapp-helper.service
may be requested by dependency only (it is configured to refuse manual start/stop).
Связанные ошибки
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Две службы конфликтуют: Conflicts= и взаимная остановка Запуск одной службы останавливает другую: параметр Conflicts=. Когда это полезно и когда мешает.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
Источники
-
systemd.unit(5)
RefuseManualStart= и RefuseManualStop=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на unit с RefuseManualStart=yes.