现象:service文件ExecStart=jar-start.sh。脚本中包含java -jar xxx命令。执行systemctl xxx start后报错java: command not found。但在终端前台启动脚本(sh jar-start.sh)就不会报错。
原因:Systemd使用固定的搜索路径。
在systemd.exec手册页中:
Systemd使用固定值
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。
所以以上路径没有java文件的话启动就会报错。
最佳解决方案是在service.sh脚本中使用java可执行文件的完整路径。
解决:jar-start.sh增加如下判断:
if [ -e /usr/bin/java ]; then
javaPath=/usr/bin/java
elif [ -e /usr/local/java/jdk1.8.0_131/bin/java ]; then
javaPath=/usr/local/java/jdk1.8.0_131/bin/java
else
source /etc/profile
javaPath=java
fi