Я хочу указать 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
. Я пытался заключить в кавычки с "
и '
и выйти =
с \
без успеха. Это кажется недокументированным.
Я думаю, что Ваша проблема должна пространство в содержании переменной среды. Смотря на примеры из 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
Альтернативное решение
"Экраны C поддерживаются в командных строках и переменных окружения"
https://www.freedesktop.org/software/systemd/man/systemd.service.html
В дополнение к тому, что говорится в принятом ответе, если вы поместите свои переменные среды в раскрывающийся файл, вам нужно использовать следующий синтаксис, чтобы убедиться, что они не все рассматриваются как один аргумент вашей программы:
[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
Я не знаю, почему использование только $ENV_NAME
сработало для меня, и ${ENV_NAME}
нет, и я не смог найти ничего, документирующего эту разницу. Все, что я могу сказать, это то, что синтаксис $ENV_NAME
работал для обработки каждого аргумента в переменной, разделенной пробелом, как отдельных аргументов, тогда как ${ENV_NAME}
обрабатывал их все как один аргумент.
Возможно, использование echo
— не лучший способ показать эту разницу. Я предлагаю всем, кто хочет протестировать его, использовать что-то вроде /usr/bin/printf "%s\n" ${ENV_NAME}
vs /usr/bin/printf "%s\n" $ ENV_NAME
, и посмотрите, что они получат.
Я нашел документацию, благодаря другому ответу:
Поддерживается базовая замена переменных среды. Используйте "${FOO}" как часть слова или как отдельное слово в командной строке, в которой случае оно будет стерто и заменено точным значением переменная среды (если есть), включая все содержащиеся в ней пробелы, всегда приводит к ровно одному аргументу. Используйте "$FOO" как отдельное слово в командной строке, в этом случае оно будет заменено по значению переменной среды, разделенной пробелом, в результате ноль или более аргументов. Для этого типа расширения кавычки соблюдаются при разбиении на слова, а потом удаленный.