Bagaimana menghindari / usr / bin / env yang ditandai di log systemd sebagai executable

15

Saya telah membuat layanan systemd untuk menjalankan aplikasi kucing jantan berdasarkan informasi yang ditemukan dalam artikel ini . Versi singkat artikel merekomendasikan untuk menghindari pembungkus skrip shell, dan mengeksekusi java secara langsung, dengan lingkungan dan baris perintah yang sesuai.

Inilah keseluruhan layanan systemd (dengan nama aplikasi diganti):

[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

Ini bekerja dengan baik sejauh yang saya tahu. Layanan mulai, berhenti, dan melaporkan status dengan benar. Masalah yang saya alami adalah dengan log seperti yang dilaporkan oleh 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

Lihat di sini bahwa envsedang dicatat sebagai executable berjalan. Saya lebih suka melihat javasebagai executable, mengingat itu adalah program yang benar-benar kita pedulikan. The envkebisingan. Saya telah memperhatikan beberapa file layanan systemd yang berbeda yang merekomendasikan awalan dengan perintah start /usr/bin/env, jadi saya berasumsi saya mungkin dapat menemukan beberapa informasi tentang log yang dihasilkan. Sepertinya tidak.

Dapatkah saya melaporkan executable javadaripada envmenggunakan pola yang sama mengeksekusi java secara langsung (bukan pembungkus startup.sh)?

Untuk poin tambahan, saya akan menyukai beberapa petunjuk dan tips tentang apa yang mungkin tidak ada pada file layanan saya. Ini adalah pertama kalinya saya menulis layanan systemd, dan saya ingin mempelajari lebih lanjut tentang praktik terbaik.

Josh Smeaton
sumber

Jawaban:

16

The SyslogIdentifier direktif memungkinkan Anda untuk mengatur nama nama executable dalam log.

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