Ho creato un servizio systemd per eseguire un'applicazione Tomcat in base alle informazioni contenute in questo articolo . La versione breve dell'articolo raccomanda di evitare i wrapper di script della shell e di eseguire java direttamente, con l'ambiente e la riga di comando appropriati.
Ecco l'intero servizio di systemd (con il nome dell'app sostituito):
[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
Funziona abbastanza bene per quanto ne so. Il servizio si avvia, si arresta e riporta correttamente lo stato. Il problema che sto riscontrando è con i registri come riportato da 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
Vedi qui quello env
viene registrato come eseguibile in esecuzione. Preferirei di gran lunga vedere java
l'eseguibile, considerando che è il programma a cui teniamo davvero. Il env
è il rumore. Ho notato diversi file di servizio di systemd che raccomandano di aggiungere un prefisso al comando start /usr/bin/env
, quindi ho pensato che potrei essere in grado di trovare alcune informazioni sui registri prodotti. Apparentemente no.
Posso segnalare l'eseguibile come java
anziché anziché env
utilizzare direttamente lo stesso schema di esecuzione di java (non i wrapper startup.sh)?
Per i punti extra, vorrei alcuni consigli e suggerimenti su ciò che il mio file di servizio potrebbe mancare. Questa è la prima volta che scrivo un servizio systemd e sono impaziente di saperne di più sulle migliori pratiche.