Como especificar uma diretiva systemd do ambiente que contém =?

20

Quero especificar uma Environment systemddiretiva que contenha =, por exemplo,

Environment=CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

e pegue o erro

[/lib/systemd/system/archiva.service:10] Invalid environment assignment, ignoring: CATALINA_OPTS=-Dappserver.home\=/var/lib/archiva/apache

no journalctl -xe. Eu tentei citar com "e 'e para escapar =com \sem sucesso. Isso parece indocumentado.

Karl Richter
fonte

Respostas:

40

Acho que seu problema se deve ao espaço no conteúdo da variável de ambiente. Observando os exemplos dos documentos do systemd , uma atribuição deve ser uma única sequência:

Exemplo:

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

Isto irá executar / bin / echo com quatro argumentos: one, two, two, e two two.

Exemplo:

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

Isso resulta em eco que está sendo chamado duas vezes, a primeira vez com argumentos 'one', 'two two' too, , e pela segunda vez com argumentos one, two two, too.

Testei isso com o seguinte serviço (observe as aspas em toda a tarefa):

[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

E obteve a saída desejada em 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

Obviamente, seria mais simples de usar EnvironmentFile. Substituir pelo Environmentseguinte deu o mesmo resultado desejado:

EnvironmentFile=/tmp/foo

Onde /tmp/foocontido (observe a falta de aspas):

CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current
muru
fonte
Quando se trata de citar aspas (por exemplo, usando CATALINA_OPTSno systemdambiente o Apache tomcat7.0.61), usar EnvironmentFilerealmente é o caminho a percorrer. Obrigado!
26915 Karl Richter
Qual é o diretório padrão / de convenção para manter um EnvironmentFile no Ubuntu? Em outros sistemas que eu já vi / etc / sysconfig /
Davos
11
@ David seria um lugar razoável /etc/default. Os arquivos foram historicamente usados ​​para colocar variáveis ​​de ambiente para os scripts init correspondentes.
muru
Eu já tenho esse arquivo no meu sistema / etc / environment que contém uma variável PATH, acrescentaria que isso seria sensato?
Davos
11
@ Davos que é em todo o sistema. Se não houver problema com a variável sendo definida para praticamente todos os processos, com certeza. Observe que /etc/environmentnão é processado por um shell; além da atribuição simples de variável, sua sintaxe é muito diferente da sintaxe systemd observada acima ou da sintaxe geral do shell.
Muru