实现原理
主要是使用linux提供的crontab机制,定时查询服务器进程是否存在,如果宕机则执行我们预设的重启脚本
实现
1. 向crontab添加任务
a. crontab -l 查询当前用户的任务
b. 创建一个文件(server_cron)输入
* * * * * sleep 10; sh /路径/server_maintenance.sh
c. cronrab server_cron (生效)
2. shell脚本
#! /bin/sh
proc_name="./server" #进程名
proc_num() #查询进程数量
{
num=$(ps -ef | grep gdms |grep $proc_name | grep -v "grep" | wc -l)
echo $num
return $num
}
proc_num
number=$? #获取进程数量
if [ $number -eq 0 ] #如果进程数量为0
then #重新启动服务器,或者扩展其它内容。
cd /home/liudongwei/workspace/server2.0/dist
nohup ./server &
fi
参考:
https://www.cnblogs.com/leodaxin/p/9222969.html
https://blog.csdn.net/shanzhizi/article/details/8123854
上个版本经过实际应用,发现严重的问题:每隔一分钟就会执行一次脚本,如果有LOG日志的话,会发现你的磁盘快满了o(╥﹏╥)o
解决问题:
- 回顾了crontab相关知识
- crontab -l
查询当前用户任务 - tail -f /var/log/syslog
查看到执行任务命令之后在日志中的信息反馈 - crontab -r
删除当前用户任务
- 分析
经过我在网上搜素相关问题,了解到有些脚本放在crontab定时器中执行,不会运行(就比如我上文提到的重启服务脚本),我上个脚本之所以执行成功,是因为 grep gram,其实我也不知道这是啥意思,我抄的。。。大意是搜索gram,这个哪有,所以函数proc_num() 返回值都是0。 - 解决
- 一行一行的理解代码
- 验证测试
- 反正我是试出来的
proc_num()
{
# ps -ef | grep ./server
# echo
# ps -ef | grep ./server | grep -v "grep"
# echo
# ps -ef | grep $proc_name | grep -v "grep" | grep -v "sh"
# echo
# ps -ef | grep $proc_name | grep -v "grep" | wc -l
# echo
# ps -ef | grep $proc_name | grep -v "grep" | grep -v "sh" |wc -l
# echo
num=$(ps -ef | grep $proc_name | grep -v "grep" | grep -v "sh" |wc -l)
# echo $num
return $num
}
总结
拿来,没有真正理解,会返工,只能多总结,多积累