¿Cómo especificar una directiva systemd de entorno que contiene =?

20

Quiero especificar una Environment systemddirectiva que contenga =, p. Ej.

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

y obtener el error

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

en journalctl -xe. Traté de cita con "y 'y para escapar =con \y sin éxito. Esto parece indocumentado.

Karl Richter
fuente

Respuestas:

40

Creo que su problema se debe al espacio en el contenido de la variable de entorno. Mirando los ejemplos de los documentos de systemd , una asignación debe ser una sola cadena:

Ejemplo:

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

Esto ejecutará / bin / echo con cuatro argumentos: one, two, two, y two two.

Ejemplo:

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

Este resultado en eco siendo llamados dos veces, la primera vez con argumentos 'one', 'two two' too, , y la segunda vez con argumentos one, two two, too.

Probé esto con el siguiente servicio (tenga en cuenta las citas de toda la tarea):

[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

Y obtuvo la salida deseada en 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

Por supuesto, sería más fácil de usar EnvironmentFile. Reemplazar el Environmentcon el siguiente dio el mismo resultado deseado:

EnvironmentFile=/tmp/foo

Donde esté /tmp/foocontenido (tenga en cuenta la falta de comillas):

CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current
muru
fuente
Cuando se trata de citas entre comillas (por ejemplo, mediante el uso CATALINA_OPTSen el systemdentorno de Apache tomcat7.0.61), usar EnvironmentFilerealmente es el camino a seguir. ¡Gracias!
Karl Richter
¿Cuál es el directorio estándar / convención para mantener un EnvironmentFile en Ubuntu? En otros sistemas he visto / etc / sysconfig /
Davos
1
@Davos sería un lugar razonable /etc/default. Los archivos allí se han utilizado históricamente para colocar variables de entorno para los scripts de inicio correspondientes.
muru
Ya tengo este archivo en mi sistema / etc / environment que contiene una variable PATH, ¿sería sensato agregarlo?
Davos
1
@Davos es todo el sistema. Si no hay ningún problema con la variable configurada para prácticamente todos los procesos, seguro. Tenga en cuenta que /etc/environmentno es procesado por un shell; aparte de la asignación de variables simples, su sintaxis es muy diferente de la sintaxis systemd indicada anteriormente o la sintaxis general de shell.
muru