Как указать Среду systemd директива, содержащая =?

Я хочу указать 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. Я пытался заключить в кавычки с " и ' и выйти = с \ без успеха. Это кажется недокументированным.

20
задан 12 July 2017 в 04:49

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
40
ответ дан 23 November 2019 в 01:49

Альтернативное решение

"Экраны C поддерживаются в командных строках и переменных окружения"

  • "\n" новая строка
  • "\r" возврат каретки
  • "\t" tab
  • "\v" вертикальная табуляция
  • "\" обратная косая черта
  • """ двойная кавычка
  • "'" одинарная кавычка
  • "\s" пробел
  • "\xxx" номер символа xx в шестнадцатеричной кодировке
  • "\nnn" номер символа nnn в восьмеричной кодировке

https://www.freedesktop.org/software/systemd/man/systemd.service.html

0
ответ дан 14 September 2020 в 06:25

В дополнение к тому, что говорится в принятом ответе, если вы поместите свои переменные среды в раскрывающийся файл, вам нужно использовать следующий синтаксис, чтобы убедиться, что они не все рассматриваются как один аргумент вашей программы:

env.conf вставной файл

[Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'

unit.service

[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, и посмотрите, что они получат.


EDIT

Я нашел документацию, благодаря другому ответу:

Поддерживается базовая замена переменных среды. Используйте "${FOO}" как часть слова или как отдельное слово в командной строке, в которой случае оно будет стерто и заменено точным значением переменная среды (если есть), включая все содержащиеся в ней пробелы, всегда приводит к ровно одному аргументу. Используйте "$FOO" как отдельное слово в командной строке, в этом случае оно будет заменено по значению переменной среды, разделенной пробелом, в результате ноль или более аргументов. Для этого типа расширения кавычки соблюдаются при разбиении на слова, а потом удаленный.

0
ответ дан 22 December 2020 в 06:13

Другие вопросы по тегам:

Похожие вопросы: