我在将 jar 应用程序作为 systemd 服务运行时遇到问题。我收到此错误:
systemd[30196]: Failed at step EXEC spawning /opt/java_apps/app1/app1.jar: Exec format error
但是当我使用 java -jar 命令手动运行它时,它运行良好。
我已经验证了目录和文件的权限,jar是使用相同的java版本构建的...
app1.服务:
[Unit]
Description=APP1 Java Service
After=syslog.target
[Service]
User=app1_user
ExecStart=/opt/java_apps/app1/app1.jar
StandardError=null
StandardOutput=null
LimitNOFILE=65536
Environment=JAVA_HOME=/opt/java/jdk-17.0.7+7
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
app1.conf:
JAVA_OPTS="-Dspring.config.location=/opt/java_apps/app1/conf/ \
-Dlogging.config=/opt/java_apps/app1/conf/logback.xml \
-Dfile.encoding=UTF-8 \
-server -Xms2g \
-Xmx2g \
-Xmn400m \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=256m \
-XX:+PrintConcurrentLocks -verbosegc -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError \
-XX:+UseGCOverheadLimit -Xlog:gc:/var/log/java_apps/app1/gc-app1-2_%t.log \
-XX:HeapDumpPath=/var/log/heapdump \
-XX:ErrorFile=/var/log/java_apps/app1/hs_err_%t.log \
-Djdk.tls.maxCertificateChainLength=100 \
-Dorg.xerial.snappy.tempdir=/opt/java_apps/snappy"
我想要一个将 app1.jar 作为 systemd 服务运行的解决方案。
这对我有用。棘手
[Unit]
Description=APP1 Java Service
After=syslog.target
[Service]
Environment="JAVA_HOME=/usr/lib/jvm/bellsoft-java20-full-amd64"
WorkingDirectory=/opt/java_apps/app1
User=app1_user
ExecStart=/usr/bin/env "${JAVA_HOME}/bin/java" -jar app1.jar
StandardError=null
StandardOutput=null
LimitNOFILE=65536
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
当然,
StandardError=null
是危险的,因为如果它失败了,你永远不会明白为什么。您可能想要StandardError=journal