Como evitar que / usr / bin / env seja marcado nos logs do systemd como executável

15

Eu criei um serviço systemd para executar um aplicativo tomcat com base nas informações encontradas neste artigo . A versão curta do artigo recomenda evitar os wrappers de script de shell e executar o java diretamente, com o ambiente e a linha de comando apropriados.

Aqui está a totalidade do serviço systemd (com o nome do aplicativo substituído):

[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

Isso funciona muito bem até onde eu sei. O serviço inicia, para e relata o status corretamente. O problema que estou tendo é com os logs, conforme relatado por 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

Veja aqui que envestá sendo registrado como o executável em execução. Eu preferiria ver javacomo o executável, considerando que esse é o programa com o qual realmente nos preocupamos. O envbarulho é. Percebi vários arquivos de serviço systemd diferentes que recomendam o prefixo do comando start /usr/bin/env, por isso presumi que talvez eu consiga encontrar algumas informações sobre os logs produzidos. Aparentemente não.

Posso relatar o executável em javavez de envusar esse mesmo padrão de execução java diretamente (não os wrappers startup.sh)?

Para obter pontos extras, gostaria de algumas dicas e sugestões sobre o que meu arquivo de serviço pode estar faltando. Esta é a primeira vez que escrevi um serviço systemd e estou interessado em aprender mais sobre as melhores práticas.

Josh Smeaton
fonte

Respostas:

16

A diretiva SyslogIdentifier permite definir o nome do nome do executável nos logs.

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