![在 systemd 服务文件中引用另一个 Java 版本](https://linux22.com/image/207335/%E5%9C%A8%20systemd%20%E6%9C%8D%E5%8A%A1%E6%96%87%E4%BB%B6%E4%B8%AD%E5%BC%95%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%20Java%20%E7%89%88%E6%9C%AC.png)
我有一个应用程序需要设置 JAVA_HOME 环境才能成功运行。然而,在 RHEL 服务器上,当前版本的 java 指向“openjdk版本“1.8.0_302”。
下面是我配置的服务文件,使其只能通过特定用户执行,并且还定义了 JAVA_HOME 路径。
[Service]
Type=simple
User=testuser
Restart=always
RestartSec=5sec
IgnoreSIGPIPE=no
KillMode=process
Environment="OPENICF_OPTS=-Xmx1024m"
Environment=JAVA_HOME=/path to jdk/JDK/jdk-11.0.15.1/
ExecStart=/path to conf file/bin/Connect.sh /start
在启用并启动此服务时,仍然使用与应用程序不兼容的 openjdk 1.8 版本执行 shell 脚本。因此,该服务无法启动并变为活动状态。
作为参考,下面是我的 shell 脚本的简短片段连接.sh。在bash脚本中,您可以看到java变量是如何定义的。
# Check Java availability
if type -p 'java' >/dev/null; then
JAVA=java
elif [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ]; then
JAVA="$JAVA_HOME/bin/java"
else
echo JAVA_HOME not available, Java is needed to run the Server
echo Please install Java and set the JAVA_HOME accordingly
exit 1
fi
有人可以帮我解决这个问题吗?我无法弄清楚我在这里做错了什么。
答案1
export PATH="${JAVA_HOME}/bin:${PATH}"
Connect.sh
在, 或,的开头假设您使用"$JAVA"
而不是java
整个脚本, 消除:
if type -p java >/dev/null; then
JAVA=java
el
或使其成为第二种情况,至少:
if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ]; then
JAVA="$JAVA_HOME/bin/java"
elif type -p java >/dev/null; then
JAVA=java
...
或者:
if [ -n "$JAVA_HOME" ]; then
JAVA="$JAVA_HOME/bin/java"
else
JAVA=java
fi
if ! type -p "$JAVA" >/dev/null; then
echo Cannot find java as instructed
exit 1
fi
(当然,这种方法意味着/usr/bin/java
只要JAVA_HOME
设置了环境变量,它就应该忽略,无论环境变量中的路径是否实际存在。)