systemd, EnvironmentFile, reutilizando variáveis ​​– como?

systemd, EnvironmentFile, reutilizando variáveis ​​– como?

Estou migrando desubir na vidaparasistema. Estou tendo um pouco de dificuldade para fazer a transição com oArquivo Ambientedirectiva. Eu não consigo entender issoArquivo Ambientetrabalhar:

########################################################
# Catalina Settings
CLUSTER_BASE=/d01/tomcat/prod/xyz
CATALINA_BASE=$CLUSTER_BASE/1
CATALINA_TMPDIR=$CATALINA_BASE/temp
CATALINA_HOME=/usr/share/tomcat7
CATALINA_PID=/run/tomcat/tc-prod-xyz-1.pid

########################################################
# Java Settings
JAVA_HOME=/usr/lib/jvm/default-java/jre
JAVA_OPTS=-Djava.awt.headless=true
JAVA_OPTS=$JAVA_OPTS -server
JAVA_OPTS=$JAVA_OPTS -Xms2048m
JAVA_OPTS=$JAVA_OPTS -Xmx2048m
JAVA_OPTS=$JAVA_OPTS -XX:MaxPermSize=2048m
JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC
JAVA_OPTS=$JAVA_OPTS -XX:+AggressiveHeap
JAVA_OPTS=$JAVA_OPTS -javaagent:$CLUSTER_BASE/newrelic/newrelic.jar

Parece que este tipo de instrução onde reutilizo uma variável:

JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC

não é suportado emsistemacomo se estivesse emsubir na vida. Fazsistemaapoiar algo assim ou preciso fazer uma declaração longa e difícil de ler?

Responder1

Infelizmente, esse arquivo que você possui é na verdade um script de shell. No passado, a maioria dos sistemas/scripts de inicialização interpretavam arquivos que forneciam variáveis ​​de ambiente usando o shell, para que você pudesse fazer coisas de shell neles. O Systemd, entretanto, não faz isso. O arquivo de ambiente é realmente um arquivo de ambiente, não um script. Isto está documentado nosystemd.execpágina de manual:

A expansão de variáveis ​​não é realizada dentro das strings, entretanto, a expansão do especificador é possível. O caractere $ não tem nenhum significado especial.

Portanto você tem 2 opções.

  1. Expanda todas as suas variáveis ​​manualmente. Significado uso CATALINA_BASE=/d01/tomcat/prod/xyz/1.

  2. Avalie o arquivo com o shell:
    ExecStart=/bin/bash -ac '. /path/to/env_file; exec /path/to/program'

Responder2

Preciso fazer uma declaração longa e difícil de ler?

Não

Uma linha que termine com uma barra invertida será concatenada com a seguinte, permitindo definições de variáveis ​​multilinhas.

Responder3

No caso específico do Tomcat (como nesta pergunta), descobri que é mais fácil colocar a maioria dessas configurações no bin/setenv.sh, que é executado pelo Tomcat na inicialização, e avalia as variáveis ​​no shell script conforme o esperado.

Então, em /etc/systemd/system/tomcat.serviceeu apenas especifico as Environmentvariáveis ​​para CATALINA_BASEand CATALINA_HOMEe depois coloco o resto do material em ${CATALINA_BASE}/bin/setenv.sh.

Responder4

Outra opção: Ter uma unidade secundária que rode antes desta e crie uma EnvironmentFileque possa usar:https://stackoverflow.com/a/42841480/32453

A unidade secundária pode usar o bash, por exemplo. Parece ser o systemdcaminho para importar env. :|

informação relacionada