impostazione delle variabili di ambiente dalla riga di comando all'interno dei file di unità


5

Sto cercando di impostare una data all'interno del file dell'unità per la registrazione

il mio file di unità è simile al seguente:

[Unit]
Description=Jetty service
After=multiuser.target

[Service]
Environment=MAIN_CLASS="com.candorgrc.nphase.MainJetty"
Type=simple
User=jetty
Group=jetty
WorkingDirectory=/home/jetty/dist
PermissionsStartOnly=true
ExecStartPre=/bin/systemctl set-environment date=$(/bin/date +%%Y-%%m-%%d-%%H-%%M)
ExecStart=/usr/bin/java -Xms512m -Xmx1024m -Djava.util.logging.config.file=/home/jetty/logging.properties -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/u01/jetty/hdumps/hdump_${date} -verbose:gc -Dcom.sun.management.jmxremote.port=12321 -Dcom.sun.management.jmxremote.authen
PIDFile=/var/run/jetty.pid
ExecReload=/bin/kill -HUP $MAINPID
#Restart=on-failure
ExecStop=/bin/kill -9 $MAINPID

L'impostazione della data non sembra funzionare. L'errore che ottengo è il seguente:

Nov 26 16:47:50 vps203756 systemctl[14275]: Failed to set environment: Invalid environment assignments
Nov 26 16:47:50 vps203756 systemd[1]: jetty.service: Control process exited, code=exited status=1
Nov 26 16:47:50 vps203756 systemd[1]: jetty.service: Failed with result 'exit-code'.
Nov 26 16:47:50 vps203756 systemd[1]: Failed to start Jetty service.

Qualche idea su come configurarlo affinché funzioni?


Risposte:


5

I comandi nelle ExecStart=unità di servizio systemd non vengono realmente eseguiti su una shell, quindi le espansioni della shell (come la sostituzione dei comandi che $(...)si usa lì) non sono realmente disponibili.

Puoi usarli chiamando esplicitamente uno script di shell, con /bin/sh -c '...', nel tuo ExecStartPre=. Per esempio:

ExecStartPre=/bin/sh -c 'systemctl set-environment date=$$(/bin/date +%%Y-%%m-%%d-%%H-%%M)'

Nota che devi sfuggire a $se stesso, usando $$, altrimenti systemd proverà ad interpretare come un'espansione variabile di systemd. (In realtà, come è il personaggio successivo (, un singolo $potrebbe funzionare lì, ma raddoppiando è l'impostazione più corretta.)

Si noti che l'utilizzo systemctl set-environmentcome si sta facendo non è davvero raccomandato, poiché si sta creando una variabile d'ambiente globale${date} che sarà disponibile ovunque.

Invece, considera di eseguire il tuo ExecStart=comando attraverso una shell, nel qual caso puoi definire una variabile di shell ${date}e usarla nel singolo posto che ti serve:

ExecStart=/bin/sh -c 'date=$$(/bin/date +%%Y-%%m-%%d-%%H-%%M); exec java -Xms512m -Xmx1024m ... -XX:HeapDumpPath=/u01/jetty/hdumps/hdump_$${date} -verbose:gc ...

Nota di nuovo, sfuggendo a $con $${date}, quindi systemd non pensa che sia una variabile systemd da espandere. Inoltre, utilizzando execper garantire che la shell venga sostituita con il javaprocesso, assicurarsi che systemd sappia quale sia il PID principale del servizio.

Sfuggire a systemd ExecStart=può diventare complessa e onerosa abbastanza rapidamente ... Quindi prendere in considerazione, invece memorizzare lo script di shell in un file (in questo caso non c'è bisogno di preoccuparsi di fuga $e di %e su come le quotazioni potrebbero funzionare in modo leggermente diverso) e basta eseguire quello script da ExecStart=, è molto più semplice (anche se richiede un file aggiuntivo ...)

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.