Creé un servicio systemd para ejecutar una aplicación tomcat basada en la información que se encuentra en este artículo . La versión corta del artículo recomienda evitar los envoltorios de script de shell y ejecutar java directamente, con el entorno y la línea de comandos adecuados.
Aquí está la totalidad del servicio systemd (con el nombre de la aplicación reemplazado):
[Unit]
Description=MyApp Tomcat Container
[Service]
EnvironmentFile=/opt/myapp/environment
ExecStart=/usr/bin/env ${JAVA_HOME}/bin/java $JAVA_OPTS $CATALINA_OPTS \
-classpath ${CLASSPATH} \
-Dcatalina.base=${CATALINA_BASE} \
-Dcatalina.home=${CATALINA_HOME} \
-Djava.endorsed.dirs=${JAVA_ENDORSED_DIRS} \
-Djava.io.tmpdir=${CATALINA_TMPDIR} \
-Djava.util.logging.config.file=${CATALINA_BASE}/conf/logging.properties \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
org.apache.catalina.startup.Bootstrap start
ExecStop=/usr/bin/env $JAVA_HOME/bin/java $JAVA_OPTS \
-classpath $CLASSPATH \
-Dcatalina.base=$CATALINA_BASE \
-Dcatalina.home=$CATALINA_HOME \
-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS \
-Djava.io.tmpdir=$CATALINA_TMPDIR \
-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
org.apache.catalina.startup.Bootstrap stop
[Install]
WantedBy=multi-user.target
Esto funciona bastante bien hasta donde yo sé. El servicio se inicia, se detiene e informa el estado correctamente. El problema que tengo es con los registros según lo informado por journalctl
:
# journalctl -u myapp.service --since today
Sep 14 00:26:00 myserver.domain.com env[654]: MyApp:2015-09-14 00:26:00: INFO Detail irrelevant
Sep 14 00:26:00 myserver.domain.com env[654]: MyApp:2015-09-14 00:26:00: INFO Detail irrelevant
Sep 14 00:26:17 myserver.domain.com env[654]: MyApp:2015-09-14 00:26:17: INFO Detail irrelevant
Vea aquí que env
se está registrando como el ejecutable en ejecución. Preferiría verlo java
como el ejecutable, considerando que ese es el programa que realmente nos importa. El env
es ruido. He notado algunos archivos de servicio systemd diferentes que recomiendan prefijar el comando de inicio /usr/bin/env
, por lo que supuse que podría encontrar alguna información sobre los registros producidos. Aparentemente no.
¿Puedo informar el ejecutable en java
lugar de env
utilizar este mismo patrón de ejecución de Java directamente (no los envoltorios startup.sh)?
Para obtener puntos adicionales, me encantaría algunos consejos y sugerencias sobre lo que podría faltar mi archivo de servicio. Esta es la primera vez que escribo un servicio systemd, y estoy ansioso por aprender más sobre las mejores prácticas.