Systemd

如何避免 /usr/bin/env 在 systemd 日誌中被標記為執行檔

  • August 11, 2021

根據本文中的資訊,我創建了一個 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 服務文件建議在 start 命令前加上/usr/bin/env,所以我認為我可能能夠找到有關生成的日誌的一些資訊。顯然不是。

我可以報告執行檔java而不是env直接使用相同的執行 java 模式(不是 startup.sh 包裝器)嗎?

對於額外的點,我會喜歡一些關於我的服務文件可能失去的提示和技巧。這是我第一次編寫系統服務,並且渴望了解更多關於最佳實踐的資訊。

SyslogIdentifier指令允許您在日誌中設置執行檔的名稱。

SyslogIdentifier=java
# or my app name, but not both!
SyslogIdentifier=myapp

引用自:https://unix.stackexchange.com/questions/229523