Подстановки в unit-файлах systemd: %i, %n, %h и другие
Короткие обозначения, которые systemd заменяет значениями при разборе unit-файла: имя unit, имя экземпляра шаблона, имя машины, домашний каталог пользователя службы.
Что делает
Подстановки делают unit-файлы переносимыми и позволяют обходиться одним шаблоном вместо десяти похожих файлов. Чаще всего используются %i в шаблонных unit и %n в оповещениях о сбоях.
Сам знак процента записывается удвоением: %%. Одиночный процент перед незнакомой буквой systemd сочтёт неверной подстановкой и отметит это в журнале.
Где ставится. В большинстве параметров любой секции. Точный список допустимых подстановок есть в документации.
Значения
| Значение | Что происходит |
|---|---|
%i | часть имени после @ в шаблонном unit, как есть. |
%I | то же, с раскодированными служебными последовательностями. |
%n | полное имя unit с расширением. |
%N | имя unit без расширения. |
%h | домашний каталог пользователя службы. |
%H | имя машины. |
%t | каталог времени работы: /run для системных служб. |
%S | каталог постоянного состояния: /var/lib для системных служб. |
Пример
Шаблон, где имя экземпляра задаёт и файл настроек, и порт.
# /etc/systemd/system/site@.service
[Service]
EnvironmentFile=/etc/sites/%i.env
WorkingDirectory=/srv/sites/%i
ExecStart=/usr/local/bin/site-server --config /etc/sites/%i.conf
StandardOutput=append:%t/sites-%i.log
Одного файла достаточно для любого числа сайтов: systemctl enable --now site@example.org.
Типичные ошибки
Одиночный % перед буквой без значения читается как неверная подстановка: для самого символа нужно %%.
%i в обычном unit пуста — параметры окажутся неполными.
Если в имени экземпляра есть косая черта, нужна %I и экранирование через systemd-escape.
Не все подстановки доступны во всех параметрах: часть работает только в командах Exec*=.
Связанные ошибки
- Unit file is bad и ошибки разбора unit-файлаsystemd не может разобрать unit-файл: неизвестные параметры, ошибки в секциях, недопустимые значения. Как найти проблемную строку.
- Unit … has no installation config: не включается автозапускsystemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.unit(5)
- systemd-escape(1)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)