在 Linux 中设置监控服务进程的定时任务,如果触发满足条件,则调用钉钉的机器人通知接口,发送消息
申请钉钉机器人
该功能属于钉钉的自定义机器人功能,在 自定义机器人接入 - 钉钉开放平台 有具体接入描述,以下就介绍一些关键点。
机器人的安全设置
在安全设置中,自定义关键词 表示:发送的消息内容中,必须包含这些提前设置好的关键词,否则消息无法发出。IP 地址段 表示:只接收来自该 IP 的请求。
本文是直接使用 Linux 的 curl
命令来实现消息发送,所以不需要勾选 加签 选项。
点击完成后,可以获取到机器人的 Webhook 地址,之后就是使用该地址向钉钉发送消息。
查看机器人的 Webhook 地址
如果地址不慎丢失,可以通过以下方式再次查看:
在 Linux 中尝试向机器人发送消息
将以下内容中的 请求地址替换为刚创建机器人的 Webhook 地址,然后发送消息,如果钉钉中成功接收到消息,则说明 API 可用。
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text","text": {"content": "监控报警:我就是我,是不一样的烟火"}}'
如下图:
Linux 编写脚本
我的 Linux 比较菜,这里只是提供一种思路。
编写通用的通知发送脚本 notify_dd.sh
keyword 就是在创建机器人时设置的关键字,同时编写的内容从外部传入的参数中接收。
#! /bin/bash
function send_notify {
keyword="监控报警"
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxx' \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "text",
"text": { "content": "'$keyword':'$1'"}
}'
}
编写完成后,使用 chmod u+x notify_dd.sh
为脚本添加执行权限。
编写进程查看脚本 monitor_monkey.sh
使用 . /opt/scripts/notify-dd.sh
将通知发送脚本引入,将其中的 send_notify 函数包装为 output_notify 函数。注意这里使用的是绝对路径,因为后续在添加定时任务时,如果使用的是相对路径则无法生效。
通过 ps -ef|grep -c StartMonkey
输出的数量来判断服务进程是否存在,如果不存在,则调用 output_notify 函数来发送通知,并重启服务。
在 output_notify 中使用 echo "$(date) : $result" >> /opt/scripts/notify-monkey.log
将请求返回的内容重定向到指定日志文件,注意这里使用的 双箭头 ,表示向日志文件中追加内容。
#! /bin/bash
. /opt/scripts/notify-dd.sh
function output_notify {
text=$1
result=$(send_notify $text)
echo "$(date) : $result" >> /opt/scripts/notify-monkey.log
}
function restart_monkey {
cd /opt/monkey/server1
nohup ./start.sh >/dev/null 2>&1 &
}
count=$(ps -ef|grep -c StartMonkey)
if [ $count != 2 ]
then
$(output_notify "检测到代码引擎宕机,正尝试重启")
$(restart_monkey)
sleep 3
if [ $(ps -ef|grep -c StartMonkey) != 2 ]
then
$(output_notify "代码引擎重启失败,请求人工介入")
else
$(output_notify "代码引擎重启成功,守护进程将持续监控")
fi
else
echo "$(date) : 代码引擎运行正常" >> /opt/scripts/notify-monkey.log
fi
编写完成后,使用 chmod u+x monitor_monkey.sh
为脚本添加执行权限。
crontab 创建定时任务
crontab 是 Linux 自带的定时任务管理工具
查看服务状态
使用 /sbin/service crond status
可以查看 crontab 的服务状态。如果服务没有启动,则使用 /sbin/service crond start
来启动服务。
添加定时任务
使用 crontab -e
可以为当前用户添加定时任务,效果如下:
* 操作方式和 vim 编辑器类似,按下英文 i 字符,进入编辑模式,输入 :wq
可保存并退出
需要注意的是:保存并退出后,需要重启 crontab 服务,新的任务才会生效 ,重启的命令是 /sbin/service crond restart
上图中第一个任务的效果是:每两个小时的第 0 分钟,会执行 /opt/scripts/monitor-monkey.sh
脚本。第二个任务的效果是:每两个小时的第 15 分钟会执行指定脚本。
具体配置规则如下图:
* 用户名可选
查看 cron 日志
要判断 crontab 中的任务是否生效,除了可以使用 crontab -l
查看当前存在的定时任务之外,还可以在 /var/log/ 目录下,搜索 cron 的日志,效果如下:
不过如果待执行的脚本中存在异常,这里并不会体现。比如上文中的 monitor-monkey.sh 脚本,在添加到定时任务后,一直无法执行成功,最后发现是因为脚本中引入的其他脚本使用的是相对路径,改为绝对路径后就好了。
最终执行效果