systemd 无法找到 Java
systemd Unable to find Java
我在 Centos Dist 上遇到一个奇怪的行为,试图 运行 使用 spring 引导创建的可引导 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 运行s 在没有服务的情况下正确)
我做错了什么?这个问题已经搞了 3 天了,快把我逼疯了。
问题的长短在于 systemd 不 运行 在与用户 shell 相同的上下文中提供服务,以及用于 运行ning .jar 文件的机制直接使用 PATH
变量来确定用于 运行 jar 的 JRE 的位置。
如果 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/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 集成到 OS 中,可能会容易得多;它省去了 PATH 的麻烦,并且可以在升级到 java 后继续存在,这会改变路径,需要更新服务定义 - 关于如何安装它有一个很好的 good guide here,系统集成:
- 下载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
我在 Centos Dist 上遇到一个奇怪的行为,试图 运行 使用 spring 引导创建的可引导 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 运行s 在没有服务的情况下正确)
我做错了什么?这个问题已经搞了 3 天了,快把我逼疯了。
问题的长短在于 systemd 不 运行 在与用户 shell 相同的上下文中提供服务,以及用于 运行ning .jar 文件的机制直接使用 PATH
变量来确定用于 运行 jar 的 JRE 的位置。
如果 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/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 集成到 OS 中,可能会容易得多;它省去了 PATH 的麻烦,并且可以在升级到 java 后继续存在,这会改变路径,需要更新服务定义 - 关于如何安装它有一个很好的 good guide here,系统集成:
- 下载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
配置javaalternatives --config java
- 设置后查看
java -version