Linux 实现进程监控,并发送通知到钉钉

568 阅读4分钟

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

申请钉钉机器人

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

机器人的安全设置

image.png

在安全设置中,自定义关键词 表示:发送的消息内容中,必须包含这些提前设置好的关键词,否则消息无法发出。IP 地址段 表示:只接收来自该 IP 的请求。 本文是直接使用 Linux 的 curl 命令来实现消息发送,所以不需要勾选 加签 选项。

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

查看机器人的 Webhook 地址

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

image.png 47AD478A-76B1-4FB1-844A-30FB2CC8DE24.png 7208C7C8-0FD9-4BAD-93AE-AFECF8481D85.png

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

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

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

如下图:

4419CADE-A7CC-4D12-8DBB-7A502021CEA7.png

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 自带的定时任务管理工具,简单描述可参考 Cron - 维基百科,自由的百科全书 。该实现方式也参考了 crontab 配置指南 - CSDN

查看服务状态

使用 /sbin/service crond status 可以查看 crontab 的服务状态。如果服务没有启动,则使用 /sbin/service crond start 来启动服务。

添加定时任务

使用 crontab -e 可以为当前用户添加定时任务,效果如下: * 操作方式和 vim 编辑器类似,按下英文 i 字符,进入编辑模式,输入 :wq 可保存并退出

F1F43F96-4B15-47E3-A3BF-5B0044C51C2D.png

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

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

具体配置规则如下图: * 用户名可选

299EF1FD-9C4B-4B0E-8794-D742F47E92F9.png 1373FD78-0DCD-4CBA-9FB3-69D734E0E27B.png

查看 cron 日志

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

735C55D7-5700-48ED-B584-E3962AF6242A.png

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

最终执行效果

A4342509-B157-46F2-B8A3-50F628FF48EC.png