Tôi đã tạo một dịch vụ systemd để chạy ứng dụng tomcat dựa trên thông tin tìm thấy trong bài viết này . Phiên bản ngắn của bài viết khuyên bạn nên tránh các trình bao bọc kịch bản lệnh shell và thực thi java trực tiếp, với môi trường và dòng lệnh thích hợp.
Đây là toàn bộ dịch vụ systemd (với tên ứng dụng được thay thế):
[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
Điều này hoạt động khá tốt như xa như tôi biết. Dịch vụ bắt đầu, dừng và báo cáo trạng thái chính xác. Vấn đề tôi gặp phải là với các bản ghi như được báo cáo bởi 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
Xem ở đây env
đang được đăng nhập như là thực thi đang chạy. Tôi rất muốn xem java
như là thực thi, xem xét đó là chương trình chúng tôi thực sự quan tâm. Các env
là tiếng ồn. Tôi đã nhận thấy khá nhiều tệp dịch vụ systemd khác nhau khuyên bạn nên thêm tiền tố vào lệnh start /usr/bin/env
, vì vậy tôi giả sử tôi có thể tìm thấy một số thông tin về các bản ghi được tạo ra. Rõ ràng là không.
Tôi có thể báo cáo tệp thực thi java
thay vì env
sử dụng cùng một mẫu thực thi java trực tiếp (không phải là trình bao bọc startup.sh) không?
Để có thêm điểm, tôi rất thích một số gợi ý và mẹo về những gì tệp dịch vụ của tôi có thể bị thiếu. Đây là lần đầu tiên tôi viết một dịch vụ systemd và muốn tìm hiểu thêm về các thực tiễn tốt nhất.