Шаблонный unit: экземпляр не запускается
Шаблонные unit удобны, но добавляют один слой ошибок: подстановка имени экземпляра. Если файл настроек для экземпляра не создан или имя содержит символы, требующие экранирования, запуск не проходит.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Нет файла настроек для этого экземпляра
Шаблон обычно подключает файл по имени экземпляра. Для нового экземпляра его надо создать.
-
Имя экземпляра требует экранирования
Косая черта, пробел и дефис в имени экземпляра должны быть преобразованы. Вручную это делают неверно.
-
Запускается шаблон без экземпляра
Файл
myapp@.serviceсам по себе не служба: у него нет значения подстановки. Запуск без части после @ не проходит.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Содержимое шаблона с подставленным экземпляром.
systemctl cat myapp@prod.serviceПравильное имя экземпляра для произвольного значения.
systemd-escape --template=myapp@.service "значение"Все экземпляры и их состояния.
systemctl list-units "myapp@*" --all --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Шаблон обычно подключает файл по имени экземпляра. Для нового экземпляра его надо создать.
- Как проверить
-
Посмотрите, что подключает шаблон, и есть ли файл.
systemctl cat myapp@prod.service | grep -iE "EnvironmentFile|ExecStart" ls -l /etc/myapp/prod.env 2>/dev/null
- Как исправить
- Создайте файл настроек для экземпляра. Если он необязателен, поставьте дефис перед путём в шаблоне.
- Почему происходит
- Косая черта, пробел и дефис в имени экземпляра должны быть преобразованы. Вручную это делают неверно.
- Как проверить
-
Получите правильное имя.
systemd-escape --template=myapp@.service "/srv/sites/example.org"
- Как исправить
-
Используйте имя из вывода команды преобразования и подстановку
%Iв шаблоне, если внутри нужен исходный путь.
- Почему происходит
- Файл
myapp@.serviceсам по себе не служба: у него нет значения подстановки. Запуск без части после @ не проходит.
- Как проверить
-
Посмотрите имя, которое вы запускаете.
systemctl list-units "myapp@*" --all --no-pager
- Как исправить
-
Указывайте экземпляр:
systemctl start myapp@prod.service. Для автозапуска включайте конкретные экземпляры.
Пример вывода
Нет файла настроек для нового экземпляра. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× myapp@stage.service - Приложение myapp (stage)
Active: failed (Result: exit-code) since Mon 2026-09-15 21:02:41 MSK; 1s ago
systemd[4700]: myapp@stage.service: Failed to load environment files: No such file or directory
systemd[4700]: myapp@stage.service: Failed at step ENV_FILES spawning /usr/local/bin/myapp: No such file or directory
Связанные ошибки
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
- Unit … not found: unit-файл не найден Сообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
- Unit … has no installation config: не включается автозапуск systemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Docker: unable to configure the Docker daemon — конфликт -H и hosts Адрес прослушивания задан дважды: ключом -H в unit-файле и параметром hosts в daemon.json. Демон отказывается стартовать.
Где встречается чаще всего
Источники
-
systemd.unit(5)
Шаблонные unit, подстановки и экранирование имён. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено запуском экземпляра без файла настроек.