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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...