Unit file is bad и ошибки разбора unit-файла
Состояние bad и сообщения вида «Unit myapp.service has a bad unit file setting» значат, что systemd прочитал файл, но не смог его принять. Обычно виновата одна строка: неверная секция, недопустимое значение или параметр не на своём месте.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Неверное имя или регистр секции
Имена секций чувствительны к регистру:
[service]вместо[Service]приводит к тому, что все параметры внутри игнорируются, и unit остаётся без исполняемой части. -
Недопустимое значение параметра
Ошибки вида
Restart=allways,Type=daemon,TimeoutStartSec=30 secondsделают unit непригодным. systemd сообщает о них при разборе, но сообщение легко пропустить в общем потоке. -
Параметр стоит не в своей секции
Классика:
WantedBy=в [Unit] вместо [Install],After=в [Service]. systemd считает такой параметр незнакомым и отбрасывает, а настройка молча не работает. -
Файл сохранён с меткой BOM или в неверной кодировке
Метка порядка байтов перед первой секцией мешает её распознать. Редактор при этом показывает файл нормальным.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Главная команда: разбирает файл так же, как systemd, и печатает конкретные претензии.
systemd-analyze verify /etc/systemd/system/myapp.serviceСтрока Loaded покажет состояние bad вместо loaded.
systemctl status myapp.service --no-pager | head -6Сообщения systemd о разборе файлов за текущую загрузку.
journalctl -b --no-pager | grep -iE "bad unit file|Unknown (key|section)" | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Имена секций чувствительны к регистру:
[service]вместо[Service]приводит к тому, что все параметры внутри игнорируются, и unit остаётся без исполняемой части.
- Как проверить
-
Посмотрите файл и разбор.
systemctl cat myapp.service | grep -n "^\[" systemd-analyze verify /etc/systemd/system/myapp.service
- Как исправить
- Приведите имена секций к правильному виду: [Unit], [Service], [Install].
- Почему происходит
- Ошибки вида
Restart=allways,Type=daemon,TimeoutStartSec=30 secondsделают unit непригодным. systemd сообщает о них при разборе, но сообщение легко пропустить в общем потоке.
- Как проверить
-
Запустите проверку файла: она печатает строку и параметр.
systemd-analyze verify /etc/systemd/system/myapp.service
- Как исправить
- Исправьте значение по сообщению проверки. Допустимые варианты для каждого параметра есть в словаре этого сайта и в документации.
- Почему происходит
- Классика:
WantedBy=в [Unit] вместо [Install],After=в [Service]. systemd считает такой параметр незнакомым и отбрасывает, а настройка молча не работает.
- Как проверить
-
Проверьте файл статической проверкой.
systemd-analyze verify /etc/systemd/system/myapp.service 2>&1 | head -20
- Как исправить
- Перенесите параметр в нужную секцию. Проверка unit-файла на этом сайте отмечает такие случаи отдельно.
- Почему происходит
- Метка порядка байтов перед первой секцией мешает её распознать. Редактор при этом показывает файл нормальным.
- Как проверить
-
Посмотрите тип файла и первые байты.
file /etc/systemd/system/myapp.service head -c3 /etc/systemd/system/myapp.service | xxd | head -1
- Как исправить
- Сохраните файл в UTF-8 без метки BOM и с переносами строк Unix.
Пример вывода
Недопустимое значение Restart= делает unit непригодным. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl status myapp.service
× myapp.service - My application
Loaded: bad-setting (Reason: Unit myapp.service has a bad unit file setting.)
Active: inactive (dead)
systemd[1]: /etc/systemd/system/myapp.service:8: Failed to parse service restart specifier, ignoring: allways
systemd[1]: myapp.service: Unit configuration has fatal error, unit will not be started.
Связанные ошибки
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
- Warning: The unit file … changed on disk Предупреждение о том, что unit-файл изменился на диске: systemd работает со старой версией. Когда нужен daemon-reload.
- WantedBy= в неверной секции: автозапуск не работает Параметр WantedBy= указан в [Unit] вместо [Install]. Служба запускается вручную, но не поднимается после перезагрузки.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Failed to parse calendar expression: ошибка в OnCalendar systemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
- Service has more than one ExecStart= setting Несколько команд запуска допустимы только при Type=oneshot. Как правильно заменить команду в переопределении.
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
Источники
-
systemd.syntax(7)
Синтаксис файлов конфигурации systemd: секции, ключи, комментарии, продолжение строк. -
systemd-analyze(1)
Команда verify и что именно она проверяет. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на unit с Restart=allways и с секцией в нижнем регистре.