Comment spécifier une directive Systemd d'environnement contenant =?

20

Je veux spécifier une Environment systemddirective contenant =, par exemple

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

et obtenez l'erreur

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

dans journalctl -xe. J'ai essayé de citer avec "et 'et pour échapper =à \sans succès. Cela semble sans papiers.

Karl Richter
la source

Réponses:

40

Je pense que votre problème est dû à l'espace dans le contenu de la variable d'environnement. En regardant les exemples des documents systemd , une affectation doit être une seule chaîne:

Exemple:

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

Cela exécutera / bin / echo avec quatre arguments: one, two, twoet two two.

Exemple:

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

Cela se traduit par écho étant appelé deux fois, la première fois avec des arguments 'one', 'two two' too, et la deuxième fois avec des arguments one, two two, too.

J'ai testé cela avec le service suivant (notez les citations autour de l'ensemble de la mission):

[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

Et obtenu la sortie souhaitée dans 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

Bien sûr, il serait plus simple à utiliser à la EnvironmentFileplace. Remplacer le Environmentpar le suivant a donné le même résultat souhaité:

EnvironmentFile=/tmp/foo

Le cas /tmp/fooéchéant (notez l'absence de guillemets):

CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current
muru
la source
Quand il s'agit de citer des guillemets (par exemple en utilisant CATALINA_OPTSdans l' systemdenvironnement pour Apache tomcat7.0.61), c'est EnvironmentFilevraiment la voie à suivre. Merci!
Karl Richter
Quel est le répertoire standard / convention pour conserver un fichier d'environnement sur Ubuntu? Sur d'autres systèmes, j'ai vu / etc / sysconfig /
Davos
1
@Davos serait un endroit raisonnable /etc/default. Historiquement, les fichiers ont été utilisés pour placer des variables d'environnement pour les scripts d'initialisation correspondants.
muru
J'ai déjà ce fichier sur mon système / etc / environnement qui contient une variable PATH, y ajouter serait-il judicieux?
Davos
1
@Davos à l'échelle du système. S'il n'y a aucun problème avec la variable définie pour pratiquement tous les processus, bien sûr. Notez que ce /etc/environmentn'est pas traité par un shell; à part l'affectation simple des variables, sa syntaxe est très différente de la syntaxe systemd indiquée ci-dessus ou de la syntaxe générale du shell.
muru