linux开机自启
背景
目前要部署一个spring boot框架的jar包,实现开机启动项目或者应用挂掉了 执行启动脚本
在root目录下有一个启动项目的脚本: app_start.sh
app_start.sh 里面内容是:
nohup java -jar xxx.jar>/dev/null 2>&1 &
linux执行 sh /root/app_start.sh 可以后台启动xxx.jar应用
一、开机自定义执行命令(脚本)(/etc/rc.d/rc.local)
简介
/etc/rc.d/rc.local 用于添加开机启动命令
/etc/rc.local是/etc/rc.d/rc.local的软连接
软连接相当于windows的快捷键
下图是linux服务器的启动流程,由此可知/etc/rc.d/rc.local文件是开机的时候会执行
配置开机执行
第一步:/etc/rc.local文件添加启动命令
vi /etc/rc.local
第二步:设置/etc/rc.d/rc.local 文件的可执行权限(重要)
文件不设置可执行权限,第一步配置的启动命令不会执行;
chmod +x /etc/rc.d/rc.local
第三步:重启服务器;查看应用是否启动成功
reboot
二、定时任务crontab
简介
Linux crontab是用来定期执行程序的命令。
当安装完成操作系统之后,默认便会启动此任务调度命令。
crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
1、cron是服务名称;
2、crond是后台进程;
3、crontab是计划任务表;
由上面的简介就知道crontab,是linux系统开机默认会启动的定时任务,并且每分锺会定期检查是否有要执行的工作;
这样我们就能定时的执行一个脚本,每10分钟、每半个小时的执行一次脚本;
开机自启&判断应用没启动,执行启动脚本
我们可以每10分钟、每半个小时 执行一次启动脚本的命令(命令如下),来保证应用始终是启动的,当然第一次 执行命令应用启动完成了,后面在执行启动命令的时候 报端口占用的异常,但是不影响已经启动的应用,所以也能满足了开机自启的需求。
sh /root/app_start.sh
基于此我们可以写一个判断脚本,判断 自启应用的端口是否被占用了,端口没被占用才执行启动脚本,避免无效的执行 启动应用脚本命令(sh /root/app_start.sh )
假如启动应用脚本命令(sh /root/app_start.sh )的应用端口是 9999,那么可以有一个/root/task_start.sh的脚本
/root/task_start.sh 脚本命令如下:
#!/bin/sh
tomcat=`netstat -an | grep ":9999" | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
if [ $tomcat -eq 0 ];then
#如果端口没有占用的话要怎么怎么样
sh /root/app_start.sh
fi
这样就根据业务需求 每10分钟、半个小时执行一次命令 sh /root/task_start.sh
来判断应用的端口如果没有被占用,端口不存在说明应用没有运行,执行启动项目的命令(sh /root/app_start.sh )
crontab 添加周期性执行脚本
crontab命令
crontab [-u username] //省略用户表表示操作当前用户的crontab
-e (编辑工作表)
-l (列出工作表里的命令)
crontab时间格式实例
- 每分钟执行一次
* * * * * sh /root/task_start.sh
- 每10分钟执行一次
*/10 * * * * sh /root/task_start.sh
- 每个小时执行一次
0 */1 * * * sh /root/task_start.sh
编辑周期性执行脚本
新增 每10分钟执行启动脚本
crontab -e
验证定时任务 是否新增完成
tail -f /var/log/cron
最后验证应用是否自启
首先:可以手动关闭应用,10分钟后看应用是否还在启用中(首次验证可以把定时任务改成每分钟执行,来快速验证一下)
最后:重启服务器,查看应用是否在运行
reboot