我创建了一个 systemd 服务来根据中找到的信息运行 tomcat 应用程序本文。本文的简短版本建议避免使用 shell 脚本包装器,并使用适当的环境和命令行直接执行 java。
这是整个 systemd 服务(替换了应用程序名称):
[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
据我所知,这非常有效。服务正确启动、停止和报告状态。我遇到的问题是报告的日志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
请参阅此处,它env
被记录为正在运行的可执行文件。我更愿意将其java
视为可执行文件,因为这是我们真正关心的程序。这env
是噪音。我注意到很多不同的 systemd 服务文件建议在启动命令前加上 前缀/usr/bin/env
,因此我认为我可能能够找到有关生成的日志的一些信息。显然不是。
我可以将可执行文件报告为java
而不是env
使用直接执行java的相同模式(而不是startup.sh包装器)吗?
为了获得额外的积分,我希望获得一些有关我的服务文件可能丢失的内容的提示和技巧。这是我第一次编写 systemd 服务,并且渴望了解有关最佳实践的更多信息。
答案1
这系统日志标识符指令允许您设置日志中可执行文件的名称。
SyslogIdentifier=java
# or my app name, but not both!
SyslogIdentifier=myapp