前言
最近接了个需求:java服务异常崩溃自启。
我在想这个需求是否合理,为什么不保证服务高可用,而是等服务挂了重启它,在这个过程中还是会有请求进不来,数据会丢失,算了,懒得跟需求方争辩(怕打起来),还是先暂时解决问题。
一、准备脚本
#!/bin/sh
#切换到目录
cd /usr/local/app
date=`date`
#查询端口占用
lsof -i:8080
# $? -ne 0 不存在 $? -eq 0存在
if [ $? -ne 0 ]
then
nohup java -jar xxx.jar >/dev/null 2>&1 &
echo $date ":=============== restart ===============" >> monitoring.log
else
echo $date ":=============== is normal ==============" >> monitoring.log
fi
这个脚本比较简单,判断端口是否被占用,如果占用就启动java程序。
二、添加定时任务
Linux crontab 命令
Linux crontab是用来定期执行程序的命令。
当安装完成操作系统之后,默认便会启动此任务调度命令。
添加或更新crontab命令
crontab -e
追加一条命令
每分钟执行脚本文件
* * * * * . /etc/profile;/bin/sh /usr/local/app/monitoring.sh
重启crond
service crond restart
查看当前系统登录用户的Crontab命令集合
crontab -l
ps:如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。
解决:在 crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效
Linux crontab 详解见:https://www.runoob.com/linux/linux-comm-crontab.html