在 Linux 中设置监控服务进程的定时任务,如果触发满足条件,则调用钉钉的机器人通知接口,发送消息

申请钉钉机器人

该功能属于钉钉的自定义机器人功能,在 自定义机器人接入 - 钉钉开放平台 有具体接入描述,以下就介绍一些关键点。

机器人的安全设置

vue 钉钉监控中心 钉钉有没有监控_vue 钉钉监控中心


在安全设置中,自定义关键词 表示:发送的消息内容中,必须包含这些提前设置好的关键词,否则消息无法发出。IP 地址段 表示:只接收来自该 IP 的请求。

本文是直接使用 Linux 的 curl 命令来实现消息发送,所以不需要勾选 加签 选项。

点击完成后,可以获取到机器人的 Webhook 地址,之后就是使用该地址向钉钉发送消息。

查看机器人的 Webhook 地址

如果地址不慎丢失,可以通过以下方式再次查看:

vue 钉钉监控中心 钉钉有没有监控_vue 钉钉监控中心_02


vue 钉钉监控中心 钉钉有没有监控_crontab_03


vue 钉钉监控中心 钉钉有没有监控_crontab_04

在 Linux 中尝试向机器人发送消息

将以下内容中的 请求地址替换为刚创建机器人的 Webhook 地址,然后发送消息,如果钉钉中成功接收到消息,则说明 API 可用。

curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \ 
	-H 'Content-Type: application/json' \ 
	-d '{"msgtype": "text","text": {"content": "监控报警:我就是我,是不一样的烟火"}}'

如下图:

vue 钉钉监控中心 钉钉有没有监控_linux_05

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 可保存并退出

vue 钉钉监控中心 钉钉有没有监控_vue 钉钉监控中心_06


需要注意的是:保存并退出后,需要重启 crontab 服务,新的任务才会生效 ,重启的命令是 /sbin/service crond restart

上图中第一个任务的效果是:每两个小时的第 0 分钟,会执行 /opt/scripts/monitor-monkey.sh 脚本。第二个任务的效果是:每两个小时的第 15 分钟会执行指定脚本。

具体配置规则如下图:

* 用户名可选

vue 钉钉监控中心 钉钉有没有监控_vue 钉钉监控中心_07


vue 钉钉监控中心 钉钉有没有监控_vue 钉钉监控中心_08

查看 cron 日志

要判断 crontab 中的任务是否生效,除了可以使用 crontab -l 查看当前存在的定时任务之外,还可以在 /var/log/ 目录下,搜索 cron 的日志,效果如下:

vue 钉钉监控中心 钉钉有没有监控_vue 钉钉监控中心_09

不过如果待执行的脚本中存在异常,这里并不会体现。比如上文中的 monitor-monkey.sh 脚本,在添加到定时任务后,一直无法执行成功,最后发现是因为脚本中引入的其他脚本使用的是相对路径,改为绝对路径后就好了。

最终执行效果

vue 钉钉监控中心 钉钉有没有监控_linux_10