【问题标题】:systemd Unable to find Javasystemd 找不到 Java
【发布时间】:2020-12-02 05:34:51
【问题描述】:

我在 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
~

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

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

我做错了什么?在这个问题上搞砸了 3 天,这让我很生气。

【问题讨论】:

  • 你在哪里设置 PATH?
  • 你是如何启动服务的?如果您使用 sudo 运行,请确保这些变量也为 root 用户配置,否则为当前用户。
  • 这样做:echo $PATH /usr/lib/jvm/jdk-14.0.2/bin:/usr/lib/jvm/jdk-14.0.2/bin:/usr/lib/jvm /jdk-14.0.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  • 我正在使用 systemctl start foo.service 运行它。我一直在运行的用户是root。
  • systemd 不在用户上下文中运行,PATH 没有被继承。将PATH添加到.service文件的[Service]部分:Environment=PATH=/usr/lib/jvm/jdk-14.0.2/bin:/usr/lib/jvm/jdk-14.0.2/bin:/usr/lib/jvm/jdk-14.0.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin,并重新加载服务(systemctl daemon-reload),然后启动服务。这应该可以解决问题。根本问题是java没有集成操作系统(默认路径中没有java)。

标签: java spring-boot centos systemctl


【解决方案1】:

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

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

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

[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

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

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

  • 下载转速
    • 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

【讨论】:

  • 再次感谢@Petesh。我对安装在操作系统中集成的其他解决方案有疑问。在我们的案例中,我认为它已经完成并且它不起作用。当我运行 java -version 它正确返回“JDK” [root@TOMCATQAPP05 osaapi]# java --version openjdk 14.0.2 2020-07-14 OpenJDK Runtime Environment (build 14.0.2+12-46) OpenJDK 64-Bit服务器虚拟机(内部版本 14.0.2+12-46,混合模式,共享)
  • “集成到操作系统”我的意思是它位于 systemd 的默认路径上 - 即,如果您运行 type -p java,它应该会产生一条通往 java 的短路径,很可能是 /usr/bin/java 而不是/usr/lib/jvm/jdk-14.0.2/bin/java
  • 好的,@Petesh。我一直在搜索我们的系统管理员是如何安装 java 的,它与您的说明不同,这可能导致它没有集成。我将尝试修复它,以便您建议我们不需要在 .service 文件中设置路径。感谢您的帮助,我是一名开发人员,对这种配置有最少的经验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2014-07-28
  • 2019-01-10
  • 2016-04-02
  • 2021-07-12
相关资源
最近更新 更多