Service has more than one ExecStart= setting
Для всех типов кроме oneshot команда запуска должна быть одна. Чаще всего эта ошибка появляется не из-за двух строк в файле, а из-за переопределения: drop-in добавляет команду к существующей, а не заменяет её.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В переопределении не сброшено прежнее значение
Списочные параметры в drop-in дополняются. Без пустого присваивания получается две команды.
-
Две команды в одном файле при неподходящем типе
Автор рассчитывал, что команды выполнятся по порядку. Для этого есть
ExecStartPre=, а не вторая строка запуска. -
Тип сменили с oneshot на другой, а команды остались
Файл с несколькими командами работал как
oneshot. После смены типа наsimpleилиnotifyте же строки стали недопустимы, и служба перестала запускаться совсем.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Все объявления команды с номерами строк и файлами.
systemctl cat myapp.service | grep -n ExecStartТип службы: от него зависит, допустимы ли несколько команд.
systemctl show myapp.service -p TypeВсе переопределения в системе.
sudo systemd-delta --type=extended | head -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Списочные параметры в drop-in дополняются. Без пустого присваивания получается две команды.
- Как проверить
-
Посмотрите все источники и итоговое значение.
systemctl cat myapp.service | grep -n ExecStart systemctl show myapp.service -p ExecStart
- Как исправить
-
Сбросьте значение пустой строкой, затем задайте новое.
[Service] ExecStart= ExecStart=/usr/local/bin/myapp --new
- Почему происходит
- Автор рассчитывал, что команды выполнятся по порядку. Для этого есть
ExecStartPre=, а не вторая строка запуска.
- Как проверить
-
Посмотрите тип и число команд.
systemctl show myapp.service -p Type systemctl cat myapp.service | grep -c "^ExecStart="
- Как исправить
-
Перенесите подготовительные шаги в
ExecStartPre=или поставьтеType=oneshot, если это последовательность задач без постоянного процесса.
- Почему происходит
- Файл с несколькими командами работал как
oneshot. После смены типа наsimpleилиnotifyте же строки стали недопустимы, и служба перестала запускаться совсем.
- Как проверить
-
Посмотрите историю правок файла и итоговый тип.
systemctl cat myapp.service | grep -nE "^(Type|ExecStart)="
- Как исправить
-
Оставьте одну команду запуска, а остальные разнесите по
ExecStartPre=. Если задача действительно состоит из нескольких шагов без долгоживущего процесса, вернитеType=oneshot.
Пример вывода
Переопределение добавило вторую команду. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: /etc/systemd/system/myapp.service.d/override.conf:2: Service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.
systemd[1]: myapp.service: Unit configuration has fatal error, unit will not be started.
Связанные ошибки
- Переопределение через drop-in не применяется Правка через systemctl edit или файл в каталоге .d не действует: разбор причин, включая особенность списочных параметров и ExecStart.
- Unit file is bad и ошибки разбора unit-файла systemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
- status=0/SUCCESS, но служба считается упавшей Программа завершилась успешно, а systemctl показывает inactive или failed. Разбор: Type=simple против forking, RemainAfterExit, демонизация.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Unit … has no installation config: не включается автозапуск systemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
Источники
-
systemd.service(5)
Ограничение на число команд запуска по типам. -
systemd.unit(5)
Сброс списочных параметров в drop-in. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено переопределением без сброса ExecStart.