Как указать системную директиву Environment, содержащую =?
Я хочу указать Environment
systemd
директива, содержащая =
например,
Environment=CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current
и получите ошибку
[/lib/systemd/system/archiva.service:10] Invalid environment assignment, ignoring: CATALINA_OPTS=-Dappserver.home\=/var/lib/archiva/apache
в journalctl -xe
, Я пытался процитировать с "
а также '
и убежать =
с \
безуспешно. Это кажется недокументированным.
3 ответа
Я думаю, что ваша проблема связана с пространством в содержимом переменной окружения. Глядя на примеры из документации по systemd, присваивание должно быть одной строкой:
Пример:
Environment="ONE=one" 'TWO=two two' ExecStart=/bin/echo $ONE $TWO ${TWO}
Это выполнит /bin/echo с четырьмя аргументами:
one
,two
,two
, а такжеtwo two
,Пример:
Environment=ONE='one' "TWO='two two' too" THREE= ExecStart=/bin/echo ${ONE} ${TWO} ${THREE} ExecStart=/bin/echo $ONE $TWO $THREE
Это приводит к тому, что эхо вызывается дважды, первый раз с аргументами
'one'
,'two two' too
,и второй раз с аргументами
one
,two two
,too
,
Я проверил это с помощью следующего сервиса (обратите внимание на кавычки вокруг всего назначения):
[Unit]
Description=My Daemon
[Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'
ExecStart=/bin/echo ${CATALINA_OPTS}
[Install]
WantedBy=multi-user.target
И получил желаемый результат в journalctl
:
Apr 26 08:19:29 laptop echo[28439]: -Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current
Конечно, было бы проще использовать EnvironmentFile
вместо. Замена Environment
со следующим дал тот же желаемый результат:
EnvironmentFile=/tmp/foo
куда /tmp/foo
содержится (обратите внимание на отсутствие кавычек):
CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current
В дополнение к тому, что говорится в принятом ответе, если вы поместите свои переменные среды в раскрывающийся файл, вам нужно использовать следующий синтаксис, чтобы убедиться, что они не все рассматриваются как один аргумент вашей программы:
вставной файл env.conf
[Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'
блок.сервис
[Unit]
Description=My Daemon
[Service]
ExecStart=/bin/echo $CATALINA_OPTS
[Install]
WantedBy=multi-user.target
Я не знаю, почему использование только что сработало для меня, а не сработало, и я не смог найти ничего, документирующего эту разницу. Все, что я могу сказать, это то, что
Возможно, используя
РЕДАКТИРОВАТЬ
Я нашел документацию благодаря другому ответу :
Поддерживается базовая замена переменных среды. Используйте «${FOO}» как часть слова или как собственное слово в командной строке, и в этом случае оно будет стерто и заменено точным значением переменной среды (если есть), включая все пробелы. он содержит, всегда приводя к ровно одному аргументу. Используйте «$FOO» как отдельное слово в командной строке, и в этом случае оно будет заменено значением переменной среды, разделенным пробелом, что приведет к нулю или более аргументам. Для этого типа расширения кавычки учитываются при разбиении на слова, а затем удаляются.
Альтернативное решение
"Экраны C поддерживаются в командных строках и переменных среды"
- "\ n" новая строка
- "\ r" возврат каретки
- вкладка "\ t"
- "\ v" вертикальная табуляция
- "\" обратная косая черта
- "" "двойные кавычки
- одинарная кавычка "'"
- пробел "\ s"
- "\ xxx" номер символа xx в шестнадцатеричной кодировке
- "\ nnn" номер символа nnn в восьмеричной кодировке
https://www.freedesktop.org/software/systemd/man/systemd.service.html