前言
工作中,经常见到需要将java设置为开机自启,通常的思路是将java设置为服务,然后纳入systemd管理,然后开启开机自启;以下是实现步骤
编写java服务脚本
在/etc/systemd/system下新建 my_java.service,内容
[Unit]
Description=My Java Application Service
After=network.target
[Service]
#当服务崩溃时自动重启
Restart=on-failure
#重启前等待10秒
RestartSec=10s
ExecStart=/opt/my_java/my_java.sh start
ExecStop=/opt/my_java/my_java.sh stop
[Install]
WantedBy=multi-user.target
为了便于维护,通常将启动命令单独保存为脚本文件,my_java.sh内容
#!/bin/sh
PNAME='my_java'
# 只有root用户才能执行
if [ $(id -u) != "0" ]; then
echo "Error: You must be root to run this script";
exit 1;
fi
# 有新jar则先移动到目标目录,实际,通常是上传到用户主目录下,然后执行脚本就行了
if [ -f /home/my_user/${PNAME}*.jar ]; then
mv /home/my_user/${PNAME}*.jar /opt/my_java;
fi
# 找到运行中的java进程id
PID=`ps auxwwwwww | grep /usr/local/jdk1.8.0_301/bin/java | grep ${PNAME} | awk '{print $2}'`
# 将jar所在路径按照时间排序
JAR=`ls -lt /opt/my_java/${PNAME}*.jar | head -1 | awk '{print $NF}'`
case "${1}" in
'start')
if [ -n "${PID}" ];
then
echo "${0}: ${PNAME} is already running: ${PID}"
exit 0
fi
# 注意,受限于systemd不能读取环境变量,所以脚本中的java命令要改为全路径
# 因为service默认是simple类型,不能以nohup方式启动
/usr/local/jdk1.8.0_301/bin/java -jar ${JAR} --spring.profiles.active=myProfile 2>&1 1>/dev/null
;;
'stop')
if [ -n "${PID}" ];
then
kill -9 $PID;
fi
;;
'restart')
if [ -n "${PID}" ];
then
kill -9 $PID;
fi
echo "/usr/local/jdk1.8.0_301/bin/java -jar ${JAR} --spring.profiles.active=myProfile 2>&1 1>/dev/null"| at now
;;
'status')
if [ -n "${PID}" ];
then
echo "${0}: ${PNAME} is ONLINE=${PID}, current jar is ${JAR}"
exit 0
else
echo "${0}: ${PNAME} is OFFLINE, current jar is ${JAR}"
exit 0
fi
;;
*)
echo "Usage: ${0} { start | stop | status }"
exit 1
;;
esac
exit 0
因为service默认类型是simple,所以不能以nohup方式启动java,可参考linux systemd Failed at step EXEC spawning /some/path/my_sh.sh: Permission denied
设置开机自启/禁用
设置开机自启
systemctl enable my_java
禁用开机自启
systemctl disable my_java
查看服务状态
systemctl status my_java
927

被折叠的 条评论
为什么被折叠?



