Come specificare una direttiva systemd Environment contenente =?


20

Voglio specificare una Environment systemddirettiva contenente =, ad es

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

e ottieni l'errore

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

in journalctl -xe. Ho provato a citare con "e 'e di fuggire =con \senza successo. Questo sembra non documentato.

Risposte:


40

Penso che il tuo problema sia dovuto allo spazio nel contenuto della variabile d'ambiente. Guardando gli esempi dai documenti systemd , un'assegnazione dovrebbe essere una singola stringa:

Esempio:

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

Questo eseguirà / bin / echo con quattro argomenti: one, two, two, e two two.

Esempio:

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

Questo comporta echo essere chiamato due volte, la prima volta con argomenti 'one', 'two two' too, , e la seconda volta con argomenti one, two two, too.

Ho provato questo con il seguente servizio (notare le virgolette intorno all'intero incarico):

[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 ottenuto l'output desiderato in 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

Certo, sarebbe invece più semplice da usare EnvironmentFile. Sostituendo il Environmentcon quanto segue si ottiene lo stesso risultato desiderato:

EnvironmentFile=/tmp/foo

Dove /tmp/foocontenuto (notare la mancanza di virgolette):

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

Quando si tratta di quotare le virgolette (ad es. Usando CATALINA_OPTSin systemdambiente per Apache tomcat7.0.61) usare EnvironmentFiledavvero è la strada da percorrere. Grazie!
Karl Richter,

Qual è la directory standard / convention per mantenere un EnvironmentFile su Ubuntu? Su altri sistemi ho visto / etc / sysconfig /
Davos il

1
@Davos sarebbe un posto ragionevole /etc/default. I file lì sono stati storicamente usati per posizionare variabili d'ambiente per gli script init corrispondenti.
Muru,

Ho già questo file sul mio sistema / etc / environment che contiene una variabile PATH, aggiungendo che sarebbe sensato?
Davos,

1
@Davos è tutto il sistema. Se non ci sono problemi con la variabile impostata per praticamente ogni processo, certo. Si noti che /etc/environmentnon viene elaborato da una shell; a parte la semplice assegnazione di variabili, la sua sintassi è molto diversa dalla sintassi di sistema e annotata sopra o dalla sintassi generale della shell.
muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.