J'ai créé un service systemd pour exécuter une application tomcat en fonction des informations trouvées dans cet article . La version courte de l'article recommande d'éviter les wrappers de script shell et d'exécuter Java directement, avec l'environnement et la ligne de commande appropriés.
Voici l'intégralité du service systemd (avec le nom de l'application remplacé):
[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
Pour autant que je sache, cela fonctionne très bien. Le service démarre, s'arrête et signale correctement l'état. Le problème que j'ai est avec les journaux tels que rapportés par 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
Voir ici qui env
est enregistré comme exécutable en cours d'exécution. Je préférerais de beaucoup voir java
l'exécutable, étant donné que c'est le programme qui nous intéresse vraiment. C'est du env
bruit. J'ai remarqué un certain nombre de fichiers de service systemd différents qui recommandent de préfixer la commande de démarrage /usr/bin/env
, donc j'ai supposé que je pourrais être en mesure de trouver des informations sur les journaux produits. Apparemment non.
Puis-je signaler l'exécutable java
plutôt qu'en env
utilisant ce même modèle d'exécution directe de Java (pas les wrappers startup.sh)?
Pour des points supplémentaires, j'aimerais quelques conseils et astuces sur ce que mon fichier de service peut manquer. C'est la première fois que j'écris un service systemd et je souhaite en savoir plus sur les meilleures pratiques.