SystemdDoctor
служба не работает конфигурация окружение частое

Переменная в unit-файле не разворачивается

systemd подставляет переменные только в командах Exec*= и только те, что заданы в Environment= или EnvironmentFile=. В остальных параметрах знак доллара — обычный символ, а переменные окружения вашей оболочки службе недоступны вовсе.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Переменная используется не в команде запуска

    В параметрах вроде WorkingDirectory= или ReadWritePaths= подстановки нет: значение берётся буквально.

  2. Переменная не задана в unit-файле

    Служба не читает профиль оболочки. Переменная, «которая есть в системе», для неё не существует.

  3. Ожидается разбор как в оболочке

    Конструкции вида ${VAR:-default}, $(команда) и арифметика systemd не разбирает. Строка уйдёт программе как есть.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Заданное окружение и разобранная команда: видно, что подставилось.

systemctl show myapp.service -p Environment -p ExecStart

Общее окружение менеджера, доступное службам.

systemctl show-environment

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Переменная используется не в команде запуска
Почему происходит
В параметрах вроде WorkingDirectory= или ReadWritePaths= подстановки нет: значение берётся буквально.
Как проверить
Посмотрите, как systemd понял значение.
systemctl show myapp.service -p WorkingDirectory -p Environment
Как исправить
Используйте подстановки systemd (%h, %t, %S) вместо переменных окружения: они работают во всех параметрах.
2. Переменная не задана в unit-файле
Почему происходит
Служба не читает профиль оболочки. Переменная, «которая есть в системе», для неё не существует.
Как проверить
Посмотрите окружение службы.
systemctl show myapp.service -p Environment -p EnvironmentFile
Как исправить
Задайте переменную явно через Environment= или файл окружения.
3. Ожидается разбор как в оболочке
Почему происходит
Конструкции вида ${VAR:-default}, $(команда) и арифметика systemd не разбирает. Строка уйдёт программе как есть.
Как проверить
Поищите такие конструкции в файле.
systemctl cat myapp.service | grep -nE "\$\{|\$\("
Как исправить
Вызовите оболочку явно (/bin/sh -c) либо вычислите значение заранее и передайте готовым.

Пример вывода

Переменная не задана и попала в аргументы буквально. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

$ systemctl cat myapp.service | grep ExecStart
ExecStart=/usr/local/bin/myapp --data $DATA_DIR

$ journalctl -u myapp.service -n 3 --no-pager
myapp[4200]: error: invalid path: "$DATA_DIR"

Связанные ошибки

Источники

  • systemd.exec(5)
    Подстановка переменных в командах Exec*= и её ограничения.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • systemd.unit(5)
    Подстановки systemd, доступные во всех параметрах.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Проверено: значение с $VAR без заданной переменной уходит программе буквально.
    собственная проверка, systemd 255
    сверено 15 сентября 2026