systemd, EnvironmentFile, reutilizando variáveis - como?

2

Estou migrando do upstart para systemd . Estou com um pouco de dificuldade para fazer a transição com a diretiva EnvironmentFile . Não consigo fazer com que este EnvironmentFile funcione:

########################################################
# 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 esse tipo de declaração é onde eu reutilizo uma variável:

JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC

não é suportado em systemd como estava em upstart . O systemd suporta algo como isso ou eu preciso fazer uma declaração longa e difícil de ler?

    
por Van 14.04.2017 / 13:49

4 respostas

5

Infelizmente, esse arquivo que você tem é, na verdade, um script de shell. No passado, a maioria dos sistemas / scripts de init interpretavam arquivos que fornecem variáveis de ambiente usando o shell, para que você pudesse fazer coisas de shell neles. No entanto, o Systemd não faz isso. O arquivo de ambiente é realmente um arquivo de ambiente, não um script. Isso está documentado na página systemd.exec man :

Variable expansion is not performed inside the strings, however, specifier expansion is possible. The $ character has no special meaning.

Portanto, você tem duas opções.

  1. Expanda todas as variáveis manualmente. Significado use 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'

por 14.04.2017 / 14:59
1

Do I need to make one long hard to read statement?

Não

A line ending with a backslash will be concatenated with the following one, allowing multiline variable definitions.

    
por 14.04.2017 / 14:09
1

Você pode usar bash para expandir suas variáveis.

Arquivo de ambiente:

BLA=bla
BLABLA=${BLA}${BLA}

Use bash -c para executar o comando:

ExecStart=/usr/bin/bash -c 'echo ${BLA} .. ${BLABLA}'

Saída:

bash[4771]: bla .. blabla
    
por 14.04.2017 / 14:34
1

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

Portanto, em /etc/systemd/system/tomcat.service , apenas especifico as variáveis Environment para CATALINA_BASE e CATALINA_HOME , e depois coloco o resto das coisas em ${CATALINA_BASE}/bin/setenv.sh .

    
por 18.03.2018 / 03:15