systemd, EnvironmentFile, reutilización de variables: ¿cómo?

systemd, EnvironmentFile, reutilización de variables: ¿cómo?

estoy migrando deadvenedizoasistemad. Estoy teniendo algunos problemas para hacer la transición con elMedio AmbienteArchivodirectiva. no puedo conseguir estoMedio AmbienteArchivotrabajar:

########################################################
# 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

Parecería que este tipo de declaración donde reutilizo una variable:

JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC

no es compatible consistemadcomo si estuviera enadvenedizo. Hacesistemad¿Apoyo algo como esto o necesito hacer una declaración larga y difícil de leer?

Respuesta1

Lamentablemente, ese archivo que tiene es en realidad un script de shell. En el pasado, la mayoría de los sistemas/scripts de inicio han interpretado archivos que proporcionan variables de entorno mediante el uso del shell, por lo que podría salirse con la suya haciendo cosas del shell en ellos. Systemd sin embargo no hace esto. El archivo de entorno es realmente un archivo de entorno, no un script. Esto está documentado en elsystemd.execpágina de manual:

La expansión de variables no se realiza dentro de las cadenas; sin embargo, es posible la expansión de especificadores. El carácter $ no tiene ningún significado especial.

Por lo tanto tienes 2 opciones.

  1. Expanda todas sus variables manualmente. Uso del significado CATALINA_BASE=/d01/tomcat/prod/xyz/1.

  2. Evalúe el archivo con el shell:
    ExecStart=/bin/bash -ac '. /path/to/env_file; exec /path/to/program'

Respuesta2

¿Necesito hacer una declaración larga y difícil de leer?

No

Una línea que termina con una barra invertida se concatenará con la siguiente, permitiendo definiciones de variables multilínea.

Respuesta3

En el caso específico de Tomcat (como en esta pregunta), descubrí que es más fácil colocar la mayoría de estas configuraciones en bin/setenv.sh, que Tomcat ejecuta al inicio y evalúa las variables en el script de shell como se esperaba.

Así que /etc/systemd/system/tomcat.servicesolo especifico las Environmentvariables para CATALINA_BASEy CATALINA_HOMEy luego pongo el resto del material ${CATALINA_BASE}/bin/setenv.sh.

Respuesta4

Otra opción: tener una unidad secundaria que se ejecute antes que esta y cree una EnvironmentFileque pueda usar:https://stackoverflow.com/a/42841480/32453

La unidad secundaria puede usar bash, por ejemplo. Parece ser la systemdforma de importar env. :|

información relacionada