场景
公司MQ服务是部署在阿里云上面的,有一段时间经常在凌晨4.5点的时候被内核kill掉进程,看了日志显示OOM,机子内存是1G,凌晨的时候没有使用MQ的场景,一时也找不出原因,只能先整个定时脚本监测服务状态。
脚本
首先,找个目录新建一个脚本,如:vi /test/checkMqtt.sh (后续填坑:此处的文件名不能包含mqtt字样,因为脚本执行kill指令的时候会把自己给Kill了。。导致后面的指令没执行)
#!/bin/sh
echo "开始执行检查MQTT状态的脚本..."
#这下面的路径,根据自己的实际安装目录来修改
cmd="cd /emqtt/emqttd/bin/"
$cmd
echo "已经进入/emqtt/emqttd/bin/目录下!开始执行检查MQTT状态指令..."
check_result=`./emqttd_ctl status`
echo "检查MQTT状态结果:$check_result"
#判断MQ状态
if [[ $check_result =~ "started" ]]
then
echo "MQTT正常运行中..."
else
echo "MQTT已经瓜了,即将重启MQTT..."
#这里杀进程是因为有些版本的MQ被内核Kill掉进程后,会有遗留的进程在
kill_mqtt=`ps -ef | grep mqtt | grep -v grep | awk '{print $2}' | xargs kill -9`
echo "杀死所有MQTT进程:$kill_mqtt"
#启动MQ
start_mqtt=`./emqttd start`
echo $start_mqtt
fi
保存,退出。
然后手动运行一下,看下有没问题:sh /test/checkMqtt.sh
没问题的话就进入下一步,放进定时任务,定时执行:crontab -e,像vi一样操作加入下面的内容,然后wq保存退出。
根据自己的实际需求修改Cron表达式
*/1 * * * * /test/checkMqtt.sh
重启crond服务:service crond restart
完成,可以自己模拟kill掉进程,看看有没生效。
后续填坑:
另外如果定时任务没执行成功的话,可以在crontab -e追加记录日志如:
*/1 * * * * /zhao/check_status.sh >> /zhao/aaa.log
或者看cat /var/log/cron有没执行
如果cron有执行,但是脚本好像没运行的话,可能是权限没给
chmod +x /zhao/check_status.sh
再重启一下服务就行了
另外,脚本也可以换成检查进程数是否满足,来判断MQ服务还在不在
#!/bin/sh
echo "开始执行检查MQTT状态的脚本..."
cmd="cd /emqtt/emqttd/bin/"
$cmd
echo "已经进入/emqtt/emqttd/bin/目录下!开始执行检查MQTT进程数量..."
count=`ps -ef |grep mqtt |grep -v "grep" |wc -l`
echo "检查MQTT状态结果:$count"
if [ $count -ge 5 ]
then
echo "MQTT正常运行中..."
else
echo "MQTT已经瓜了,即将重启MQTT..."
kill_mqtt=`ps -ef | grep mqtt | grep -v grep | awk '{print $2}' | xargs kill -9`
echo "杀死所有MQTT进程:$kill_mqtt"
sleep 5s
start_mqtt=`./emqttd start`
echo $start_mqtt
echo "已执行重启操作..."
fi
注:仅供自己学习,记录问题和参考,若有带来误解和不便请见谅,共勉!