나는 다음에서 찾은 정보를 기반으로 Tomcat 응용 프로그램을 실행하기 위해 systemd 서비스를 만들었습니다.이 기사. 이 기사의 짧은 버전에서는 쉘 스크립트 래퍼를 피하고 적절한 환경과 명령줄을 사용하여 직접 Java를 실행할 것을 권장합니다.
다음은 전체 시스템 서비스입니다(응용 프로그램 이름이 대체됨).
[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
생성된 로그에 대한 정보를 찾을 수 있을 것이라고 생각했습니다. 당연히 아니.
java
java를 직접 실행하는 동일한 패턴을 사용 하는 대신 env
(startup.sh 래퍼 대신) 실행 파일을 보고할 수 있나요 ?
추가 사항으로 내 서비스 파일에서 누락된 내용에 대한 몇 가지 팁과 요령을 알고 싶습니다. 체계적 서비스를 작성하는 것은 이번이 처음이며 모범 사례에 대해 더 많이 배우고 싶습니다.
답변1
이것시스템 로그 식별자지시어를 사용하면 로그에 실행 파일의 이름을 설정할 수 있습니다.
SyslogIdentifier=java
# or my app name, but not both!
SyslogIdentifier=myapp