微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

systemd找不到Java

如何解决systemd找不到Java

我在Centos dist上遇到奇怪的行为,试图运行使用Spring Boot创建的可启动jar。

如果我从外壳程序运行jar应用程序,它将完美运行

enter image description here

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

[Unit]
Description=app
After=syslog.target

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

[Install]
WantedBy=multi-user.target
~

我一直收到错误消息“无法找到Java”

enter image description here

我检查了$ PATH和$ JAVA_HOME属性,并正确设置了它们(我不认为这会添加更多信息,因为可启动jar无需运行任何服务即可正确运行)

我做错了什么?解决这个问题已经三天了,这让我发疯了。

解决方法

这个问题的长处和短处是systemd不会在与用户外壳程序相同的上下文中运行服务,并且用于运行.jar文件的机制直接使用PATH变量来确定目录的位置。 JRE用于运行jar。

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

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

[Unit]
Description=app
After=syslog.target

[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
ExecStart=/foo/bar/app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

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

如果要使用的jre集成到OS中,可能会容易得多。它省去了使用PATH的麻烦,并且可以在升级到Java后幸免,这会改变路径,需要更新服务定义-系统安装非常漂亮,good guide here是关于如何安装它的: / p>

  • 下载rpm
    • 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。