Environment= в systemd: переменные окружения службы
Задаёт переменные окружения для процессов службы в виде «ИМЯ=значение». Окружение службы не связано с вашим профилем оболочки: ни .bashrc, ни .profile она не читает.
Что делает
Это источник классической путаницы «в терминале работает, в службе нет». У службы короткий PATH и никаких переменных, которые вы привыкли видеть. Всё, что программе нужно, задаётся здесь или в файле окружения.
systemd не разворачивает переменные внутри значений: запись Environment=PATH=$PATH:/opt/bin попадёт в окружение буквально, вместе со знаком доллара. Собирать значения из других переменных нужно заранее или в скрипте-обёртке.
Где ставится. В секции [Service]. Допустимо несколько строк, каждая с одной или несколькими парами.
Значения
| Значение | Что происходит |
|---|---|
Environment=LANG=ru_RU.UTF-8 | одна переменная. |
Environment="ARGS=--flag value" PORT=8080 | значение с пробелом берётся в кавычки. |
Environment=PATH=/usr/local/bin:/usr/bin:/bin | полная замена PATH — без подстановки прежнего. |
Пример
Переменные для приложения и явный PATH.
[Service]
Environment=NODE_ENV=production
Environment=PORT=8080
Environment=PATH=/usr/local/bin:/usr/bin:/bin
ExecStart=/usr/local/bin/node /opt/app/server.js
Секреты так передавать не стоит: значения видны в systemctl show и в /proc. Для них есть LoadCredential=.
Типичные ошибки
Подстановки вида $PATH внутри значения не разворачиваются: строка попадёт в окружение как есть.
Секреты в переменных видны любому, кто может выполнить systemctl show: используйте учётные данные.
Переменные из профиля пользователя службе недоступны — их нужно задавать явно.
Значение с пробелами без кавычек будет разобрано как несколько переменных.
Связанные ошибки
- status=127 в systemd: команда не найденаКод 127 без имени: оболочка не нашла команду. Появляется, когда ExecStart запускает скрипт или sh -c, а внутри команды нет.
- status=203/EXEC в systemdКод 203/EXEC означает, что systemd не смог выполнить программу из ExecStart=. Разбор причин: путь, права, интерпретатор, синтаксис оболочки.
- status=2/INVALIDARGUMENT в systemdКод 2/INVALIDARGUMENT: программа сочла аргументы или настройки недопустимыми. Частая причина — лишние кавычки в ExecStart=.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)