Estoy escribiendo un archivo de unidad systemd para una aplicación Java y me gustaría controlar la versión de Java utilizada para iniciarlo. Mi (simplificado) archivo de servicio es
[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143
Cuando se trata de ponerlo en marcha me sale un error de vuelta
Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/[email protected]:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: [email protected] lacks both ExecStart= and ExecStop= setting. Refusing.
Sé que JAVA_HOME
se establece correctamente; si cambio la ExecStart
línea para comenzar /usr/bin/java
y luego agrego algo como -DsomeOption=${JAVA_HOME}
puedo verlo bien.
La solución obvia es crear una secuencia de comandos de contenedor, pero creo que no sirve para nada el uso de un archivo de servicio.
¿Cómo puedo configurar JAVA_HOME para mi aplicación Java usando un archivo de unidad?
Respuestas:
Desde la sección "Líneas de comando" en systemd.service (5):
Iba a sugerir el uso de la especificador instancia
%i
(se puede leer más sobre esto en systemd.unit (5)), pero (ahora estamos de vuelta en systemd.service (5)):Creo que la mejor opción en este momento realmente es crear un script de shell que envuelva la ejecución del binario de Java como lo sugiere Warren Young o podría ejecutar ExecStart directamente como en el ejemplo de las líneas de comando de shell en la sección "Líneas de comando" de systemd.service (5) que tiene el siguiente ejemplo:
para que puedas hacer (no probado):
fuente
Otra opción similar es usar
/usr/bin/env
:De esta manera, puede omitir
'
comillas alrededor del comando completo, lo que es útil si necesita anidar cosas entre comillas.PD. Como nota al margen, es importante encerrar los nombres de las variables entre
{
llaves}
en los archivos de Systemd o, de lo contrario, no se reconocerán correctamente.fuente