web-dev-qa-db-ja.com

/ usr / bin / envがsystemdログで実行可能ファイルとしてマークされないようにする方法

この記事 にある情報に基づいて、Tomcatアプリケーションを実行するsystemdサービスを作成しました。記事の短いバージョンでは、シェルスクリプトラッパーを回避し、適切な環境とコマンドラインを使用して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はノイズです。 startコマンドの前に/usr/bin/envを付けることを推奨するかなり多くの異なるsystemdサービスファイルに気付いたので、生成されたログに関する情報を見つけることができると思いました。どうやらそうではない。

(startup.shラッパーではなく)Javaを直接実行する同じパターンを使用しながら、実行可能ファイルをJavaではなくenvとして報告できますか?

余分なポイントについては、サービスファイルが欠落している可能性があるものについてのヒントをいくつか教えてください。私がsystemdサービスを作成したのはこれが初めてであり、ベストプラクティスについてもっと学びたいと思っています。

15
Josh Smeaton

SyslogIdentifier ディレクティブを使用すると、実行可能ファイルの名前をログに設定できます。

SyslogIdentifier=Java
# or my app name, but not both!
SyslogIdentifier=myapp
16
Josh Smeaton