Systemd
如何避免 /usr/bin/env 在 systemd 日誌中被標記為執行檔
根據本文中的資訊,我創建了一個 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