Use uma variável em outra declarada dentro do mesmo EnvironmentFile no arquivo de unidade do systemd

1

Eu tenho um longo conjunto de argumentos para passar para um executável. Eu criei um arquivo systemd unit simples e ele funciona bem:

[Unit]
Description=My Service

[Service]
WorkingDirectory=/opt/my-service
EnvironmentFile=-/opt/my-service/environment
ExecStart=/usr/bin/java $JAVA_ARGS -jar /opt/my-service/my-service.jar

[Install]
WantedBy=multi-user.target

Em /opt/my-service/environment , tenho o seguinte (apenas um exemplo):

JAVA_ARGS=-server -Xms1500m -Xmx1500m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:NewRatio=1 -XX:SurvivorRatio=4 -Djava.io.tmpdir=/opt/my-service/tmp

Eu gostaria de poder dividir essa variável em vários para torná-la um pouco mais compreensível. Algo assim:

JAVA_TMP_DIR=/opt/my-service/tmp
JAVA_JVM_ARGS=-server -Xms1500m -Xmx1500m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:NewRatio=1 -XX:SurvivorRatio=4
JAVA_ARGS=$JAVA_JVM_ARGS -Djava.io.tmpdir=$JAVA_TMP_DIR

Mas quando eu uso isso, os valores de $JAVA_JVM_ARGS e $JAVA_TMP_DIR não são substituídos e são impressos como está em $JAVA_ARGS (que é apropriadamente substituído):

[root@ip-10-0-1-140 system]# systemctl status my-service
my-service.service - My Service
   Loaded: loaded (/etc/systemd/system/my-service.service; enabled)
   Active: failed (Result: exit-code) since Thu 2016-01-14 11:01:05 UTC; 3s ago
  Process: 28148 ExecStart=/usr/bin/java $JAVA_ARGS -jar /opt/my-service/my-service.jar (code=exited, status=1/FAILURE)
 Main PID: 28148 (code=exited, status=1/FAILURE)

Jan 14 11:01:05 ip-10-0-1-140.us-west-1.compute.internal systemd[1]: Started My Service.
Jan 14 11:01:05 ip-10-0-1-140.us-west-1.compute.internal java[28148]: Error: Could not find or load main class $JAVA_JVM_ARGS
Jan 14 11:01:05 ip-10-0-1-140.us-west-1.compute.internal systemd[1]: my-service.service: main process exited, code=exited, status=1/FAILURE
Jan 14 11:01:05 ip-10-0-1-140.us-west-1.compute.internal systemd[1]: Unit my-service.service entered failed state.

Existe alguma maneira de obter esse comportamento usando arquivos de ambiente?

    
por Nicolas 14.01.2016 / 12:05

1 resposta

0

Editar: Acabamos de encontrar uma solução diferente:
Se você tem isso

JAVA_TMP_DIR=/opt/my-service/tmp
JAVA_JVM_ARGS=-server -Xms1500m -Xmx1500m ... 
...

então você pode definir o ExecStart assim

ExecStart=/usr/bin/java $JAVA_JVM_ARGS -Djava.io.tmpdir=${JAVA_TMP_DIR} -jar /opt/my-service/my-service.jar

(verifique se a segunda variável está em {})

Abaixo da postagem original, provavelmente também uma solução para alguém:

Na verdade, parece não funcionar, se você tiver uma variável dentro do parâmetro como -Djava.io.tmpdir=$JAVA_TMP_DIR

Eu sugiro que você resolva seu problema assim. Altere seu EnvironmentFile assim:

JAVA_TMP_DIR='-Djava.io.tmpdir=/opt/my-service/tmp'

Em seguida, você pode alterar a linha de inicialização do arquivo de unidade para esta:

ExecStart=/usr/bin/java $JAVA_JVM_ARGS $JAVA_TMP_DIR -jar /opt/my-service/my-service.jar

Isso funcionou no meu caso.

    
por 07.09.2017 / 14:05

Tags