systemd 找不到 Java

eBu*_*san 3 java centos spring-boot systemctl

我在 Centos Dist 上遇到了一个奇怪的行为,试图运行用 spring boot 创建的可启动 jar。

如果我从 shell 运行 jar 应用程序,它会完美运行

在此处输入图片说明

使用使用以下配置创建的服务运行应用程序时:

[Unit]
Description=app
After=syslog.target

[Service]
ExecStart=/foo/bar/app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
~
Run Code Online (Sandbox Code Playgroud)

我不断收到错误“无法找到 Java”

在此处输入图片说明

我检查了 $PATH 和 $JAVA_HOME 属性,它们设置正确(我认为这不会增加更多信息,因为可启动 jar 可以在没有服务的情况下正常运行)

我做错了什么?解决这个问题已经 3 天了,这让我很生气。

Pet*_*esh 6

问题的长短是 systemd 没有在与用户 shell 相同的上下文中运行服务,用于运行 .jar 文件的机制直接使用PATH变量来确定运行 jar 的 JRE 的位置。

如果 java 在默认的 systemd 路径上,那么服务将默认启动。systemd默认路径肯定不包含您为 java 指定的路径。

为了解决未充分设置 PATH 变量的问题,我们将使用PATH更适合它的环境变量更新服务配置。为此,我们需要向服务定义文件Environment[Service]部分添加一个变量。

[Unit]
Description=app
After=syslog.target

[Service]
Environment=PATH=/usr/lib/jvm/jdk-14.0.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ExecStart=/foo/bar/app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

然后我们重新加载systemd(systemctl daemon-reload),我们应该可以启动服务(systemctl start blah.service)。

如果您要使用的 jre 集成到操作系统中,那可能会容易得多;它省去了 PATH 的麻烦,并且可以在升级到 java 后幸存下来,这会改变路径,需要更新服务定义 - 这里有一个关于如何安装它的非常好的指南,系统集成:

  • 下载转速
    • wget --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/14.0.2+12/205943a0976c4ed48cb16f1043c5c647/jdk-14.0.2_linux-x64_bin.rpm
  • 本地安装
    • yum localinstall jdk-14.0.2_linux-x64_bin.rpm
  • 使用alternatives来配置Java
    • alternatives --config java
  • 设置后检查
    • java -version