DefaultInstance= и шаблонные unit systemd
Задаёт экземпляр по умолчанию для шаблонного unit — файла с символом @ в имени. Позволяет включить шаблон без явного указания экземпляра.
Что делает
Шаблонный unit — это один файл для многих однотипных служб. Часть имени после @ становится значением подстановки %i, и его используют как параметр: номер порта, имя сайта, версия кластера. Так работают postgresql@16-main.service и getty@tty1.service.
Экземпляр указывается при запуске и включении: systemctl enable myapp@prod.service. Без него включить шаблон нельзя — если только не задан экземпляр по умолчанию.
Где ставится. В секции [Install] шаблонного unit. Подстановки %i и %I используются в остальных секциях.
Значения
| Значение | Что происходит |
|---|---|
%i | часть имени после @ в исходном виде. |
%I | то же, но с раскодированными служебными последовательностями. |
DefaultInstance=prod | экземпляр по умолчанию для включения без явного имени. |
Пример
Один файл для нескольких окружений.
# /etc/systemd/system/myapp@.service
[Unit]
Description=Приложение myapp (%i)
[Service]
EnvironmentFile=/etc/myapp/%i.env
ExecStart=/usr/local/bin/myapp --env %i
[Install]
WantedBy=multi-user.target
DefaultInstance=prod
# запуск: systemctl enable --now myapp@prod.service
Типичные ошибки
Подстановка %i в обычном (нешаблонном) unit пуста — параметры окажутся неполными.
Включить шаблон без экземпляра нельзя, если не задан экземпляр по умолчанию.
Если в экземпляре есть косая черта или пробел, нужна подстановка %I и экранирование через systemd-escape.
Связанные ошибки
- Unit … has no installation config: не включается автозапускsystemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
- Unit … not found: unit-файл не найденСообщение Unit not found при запуске службы: файла нет, не выполнен daemon-reload, опечатка в имени или не указано расширение.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.unit(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)