centos systemd 方式设置java开机自启、系统服务
前言
工作中,经常见到需要将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 # ps aux 命令可能被截断,ps auxww会展示全部 PID=`ps auxww | 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如果启动失败,查看日志
journalctl -u my_java