Stworzyłem usystematyzowaną usługę do uruchamiania aplikacji tomcat na podstawie informacji zawartych w tym artykule . W krótkiej wersji tego artykułu zaleca się unikanie owijania skryptów powłoki i bezpośrednie uruchamianie java za pomocą odpowiedniego środowiska i wiersza poleceń.
Oto całość usługi systemowej (z zastąpioną nazwą aplikacji):
[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
O ile mi wiadomo, działa to całkiem dobrze. Usługa uruchamia się, zatrzymuje i zgłasza poprawnie status. Mam problem z logami zgłoszonymi przez 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
Zobacz tutaj, który env
jest rejestrowany jako działający plik wykonywalny. Wolałbym raczej zobaczyć java
jako plik wykonywalny, biorąc pod uwagę, że to program, na którym nam naprawdę zależy. To env
jest hałas. Zauważyłem całkiem sporo różnych plików usługi systemowej, które zalecają prefiks komendy start /usr/bin/env
, więc założyłem, że być może uda mi się znaleźć informacje na temat utworzonych dzienników. Najwyraźniej nie.
Czy mogę zgłosić plik wykonywalny java
raczej niż env
podczas korzystania z tego samego wzorca bezpośredniego wykonywania Java (a nie opakowań startup.sh)?
Aby uzyskać dodatkowe punkty, chciałbym uzyskać kilka wskazówek i porad dotyczących tego, czego może brakować w moim pliku usługi. To pierwszy raz, kiedy napisałem usługę systemową i chcę dowiedzieć się więcej o najlepszych praktykach.