Как указать системную директиву Environment, содержащую =?

20

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

Карл Рихтер
источник

Ответы:

40

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

Пример:

Environment="ONE=one" 'TWO=two two'
ExecStart=/bin/echo $ONE $TWO ${TWO}

Это будет выполняться / бен / эхо с четырьмя аргументами: 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
Мур
источник
Когда дело доходит до цитирования цитат (например, с использованием CATALINA_OPTSв systemdсреде для Apache tomcat7.0.61), использование EnvironmentFileдействительно - путь. Благодарность!
Карл Рихтер
Что такое стандартная / условная директория для хранения EnvironmentFile в Ubuntu? В других системах я видел / etc / sysconfig /
Давос
1
@ Давос был бы разумным местом /etc/default. Там файлы исторически использовались для размещения переменных среды для соответствующих сценариев инициализации.
Муру
У меня есть этот файл уже в моей системе / etc / environment, который содержит переменную PATH, было бы разумным добавить это?
Давос,
1
@ Давос, это общесистемный. Если нет проблем с переменной, устанавливаемой практически для каждого процесса, конечно. Обратите внимание, что /etc/environmentне обрабатывается оболочкой; кроме простого присваивания переменной, ее синтаксис сильно отличается от системного синтаксиса, упомянутого выше, или общего синтаксиса оболочки.
Муру