背景: 有的时候因为集群资源紧张, 导致服务器的进程挂掉, 这时候我们正好在睡觉, 没有及时把服务拉起, 导致第二天一上班, 一堆东西没有跑出来, 被疯狂@, 为了避免这些问题经常发生, 需要将程监控起来,如果挂掉了, 自动将进程拉起, 并将报错信息发送至钉钉群, @自己(@别人也是可以的, 哈哈)
准备 :
- 会使用Linux crontab 命令
- 会shell脚本的基础语法
- 在钉钉群中创建机器人
第一步 : 现在钉钉群众创建钉钉机器人 :
找到一个钉钉群, 点击群设置 :
点击只能群助手 :
选择添加机器人
选择自定义机器人
点击添加
按如下图进行配置
创建出来之后会给一个钉钉机器人的地址,这个地址一定要保管好, 不介意外漏, 这个地址一会会用到
钉钉机器人创建完成, 开始编写shell脚本:
vim /home/docs/rebootPid.sh
#!/bin/bash
log_dir="/home/docs/logs/rebootPid.log"
alarm() {
atMobiles="在钉钉中@人, 需要写入这个人的手机号,自己修改"
#这个keyword和刚才在钉钉创建的关键词一样
keyword="进程监控"
dintalkurl="这里是刚才创建钉钉机器人生成的链接"
msg2="$ecs master ${1}的${keyword}挂掉了"
curl ${dintalkurl} \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text",
"text": {
"content": "'"$msg2"'"
},
"at": {
"atMobiles": ['$atMobiles'],
"isAtAll": false # 是否@所有人
}
}'
}
teacher() {
# 切换到进程的目录, 在判断进程是否存在
$2
#判断进程是否存在 $1 是进程名字,请自己指定
ps -ef | grep $1 | grep -v grep
if [ $? -ne 0 ]; then
# 如果进程不存在就调用方法将报警信息推送至顶顶群
alarm $1 >>$log_dir
# 切换到进程的目录
$2
# 重启进程
$3
timestanp=$(date '+%Y-%m-%d %H:%M:%S')
echo "$timestanp $1 重启," >>$log_dir
exit
else
echo "The program is running"
exit
fi
}
teaching share_reflow.jar 'cd /etl' 'nohup java -jar /etl/share_reflow.jar &' >>$log_dir 2>&1 &
然后通过crontab 将这个脚本添加到调度器里面, 每一分钟调度一次, 问:为什么不直接使用while true让他无限循环去监控呢? 那如果这个脚本挂掉了怎么办?难道在写个脚本吧这个脚本监控起来, 在写个脚本,吧那个脚本监控起来, 显然是不合理的, 通过这个调度器, 即使这个脚本挂掉了, 也会在下一次调度的时候起来
输入crontab -e 编辑调度器
[root@master ~]# crontab -e
# 在文件中写入以下配置:
#---------------------进程监控
* */1 * * * nohup sh /home/docs/rebootPid.sh &
查看进程并, 将进程杀死, 进行测试 :
[root@ master etl]# ps -ef | grep share_reflow.jar | grep -v grep
root 5628 1 0 Mar28 ? 00:06:38 nohup java -jar /etl/share_reflow.jar &
[root@ master etl]# kill -9 5628
[root@ master etl]#
查看钉钉报警群
配置完成