首先systemd服务文件
/etc/systemd/system/test.service(文件简化处理了)
[Unit]
Description=test
After=network.target
[Service]
ExecStart=/opt/test/bin/test_start.sh
[Install]
WantedBy=multi-user.target
其中启动命令ExecStart指向的是一个sh启动脚本,
脚本内就是简单的jar包启动命令 java -jar test.jar
然后执行启动命令:
sudo systemctl restart test.service
查看日志发现
3月 06 17:33:29 localhost.localdomain test.sh[8322]: /opt/cloud/bin/test_start.sh:行2: java: 未找到命令
3月 06 17:33:29 localhost.localdomain systemd[1]: test.service: Main process exited, code=exited, status=127/n/a
3月 06 17:33:29 localhost.localdomain systemd[1]: test.service: Failed with result 'exit-code'.
但是单独执行这个sh脚本是能找到java命令的
解决方案1:
在service文件中的==[service]==块添加java环境:
Environment=JAVA_HOME=/opt/jdk
解决方案2:
在sh脚本文件里面,添加环境变量信息(没有尝试,也是不推荐)
我这里有从别处转移的十几个servcie文件,不想一一修改,所以不采用这两个方案
在网上一顿摸索(可看最后的最终解决方案):
尝试1:
在 /etc/profile 或者 /etc/bashrc 中配置JAVA_HOME变量,这个是系统变量,在所有用户登陆的时候会加载进去,这样配置完java环境后,所有用户都能使用java命令,但是不适用Systemd
尝试2:
在 /etc/environment 配置PATH环境,也不行
最终解决方案
将java指令都添加到软连接
sudo ln -s /opt/jdks/jdk-11/bin/java /usr/bin/java
sudo ln -s /opt/jdks/jdk-11/bin/javac /usr/bin/javac
sudo ln -s /opt/jdks/jdk-11/bin/javadoc /usr/bin/javadoc
sudo ln -s /opt/jdks/jdk-11/bin/javap /usr/bin/javap
可去 /usr/bin里面确认下(可以看到已经添加成功了)
然后在启动服务就可以了