• linux/CentOS 服务器中cpu、内存、磁盘及中间件监听,钉钉机器人告警


    一、背景

    当前不同的公司服务器较多,在项目开发、部署和演示过程多次遇到服务器无故宕机的情况,另外各服务器上部署的中间件也存在无故下线的情况,如果出现以上情况就特别棘手,而技术人员无法第一时间感知。

    二、操作说明

    1、检查服务器curl命令是否可用

    (1)调用相关命令进行检查

    # 查看当前版本
    curl --version 
    # 检查网站是否可达,若html显示在屏幕上则证明命令可用
    curl http://www.baidu.com
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (2)如果无法调用,则可参照文章进行curl安装
    https://blog.csdn.net/qq_38215042/article/details/108768839

    2、shell文件配置

    (1)当前是将服务器CPU相关监听和中间件的Shell脚本文件分开设置的,主要是考虑到文件过大,在配置修改和定时命令执行时出现问题不好排查,执行时间也会比较耗时。
    (2)在相应的shell脚本文件中,已经将配置可能要修改点作了标记,可根据实际情况进行针对性修改。
    (3)在shell脚本修改完成后,查看脚本是否执行权限,没有则调用命令进行设置

    # 将sh文件添加可执行权限
    chmod u+x dingtalk.sh 
    # 或设置全部权限
    chmod 777 dingtalk.sh
    
    • 1
    • 2
    • 3
    • 4

    (4)权限设置后,可先调用执行一下,检查下是否有格式问题
    ./dingtalk.sh或相对路径执行./home/admin/server/dingtalk.sh

    3、定时任务创建

    定时任务常用命令如下

    crontab -u //设定特定用户的定时服务
    crontab -l //列出当前用户定时服务内容
    crontab -r //删除当前用户的定时服务
    crontab -e //编辑当前用户的定时服务
    在设定编辑之前都建议列出服务查看一下:crontab -l
    
    • 1
    • 2
    • 3
    • 4
    • 5
    # 对cron定时任务列表进行编辑
    crontab -e
    # i 进行修改,ESC键退出编辑,;wq保存并退出
    # 每五分钟执行一次
    */5 * * * * sh xx.sh
    # 每半小时执行一次
    */30 * * * * sh  xx.sh
    # 每天的1525分执行一次
    25 15 * * * sh xx.sh
    
    # 中间件脚本文件
     */5 * * * * sh /home/admin/server/dingtalk.sh
    # 服务器脚本文件
     */5 * * * * sh /home/admin/server/dingtalk_server.sh
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    命令说明
    在这里插入图片描述

    4、定时任务执行情况检查

    # 进入定时任务log下
    cd /var/log
    # 查看定时任务是否调用
    tail -f cron
    
    • 1
    • 2
    • 3
    • 4

    三、Shell配置说明

    1、服务器CPU、内存、磁盘监控

    #!/bin/bash
    
    #【配置1】要@的人员手机号码,此处的手机号必须和钉钉上的一致
     user="17858888888"
    # user1="13888888888"
    # user2="XXXX"
    
    #【配置2】网卡配置(可选),此处配置的是想要展示的ip地址,使用ifconfig查看inet对应的ip
    ifconfig="eth0"
    
    #主机信息
     Date=`date +%Y-%m-%d`
     Date_time=`date "+%Y-%m-%d--%H:%M:%S"`
     Host_name=`hostname`
     IP_addr=`ifconfig $ifconfig | grep "inet" |awk 'NR==1{ print $2}'`
    
     #获取cpu使用率
    cpuUsage=`top -b -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%d", 100-v;}'`
    
    #获取磁盘使用率
    data_name="/" 
    diskUsage=`df -h | grep -w $data_name | awk -F'[ %]+' '{print $5}'`
    
    #统计内存使用率
    mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`
    
    #【配置3】钉钉webhook
    Dingding_Url="https://oapi.dingtalk.com/robot/send?access_token=xxxxxx"
     
    
    #【配置4】服务监听-发送钉钉消息,消息内容可修改
    # at中atMobiles为数组结构,可添加上面配置的user1、user2等,可根据不同的业务@指定的人员,isAtAll是否@所有人设置
    function SendServerMessageToDingding(){
    curl ${Dingding_Url} -H 'Content-Type: application/json' -d '{
     "msgtype":"text",
     "text":{"content":"服务监控:\n服务器资源耗尽警告,请尽快处理!\n巡查时间:'${Date_time}'\nIP地址:'${IP_addr}'\n资源状况如下:\n【CPU可用:'${cpuUsage}'%】\n【磁盘使用率:'${diskUsage}'%】\n【内存使用率:'${mem_used_persent}'%】"},
     "at":{"atMobiles":['${user}'],"isAtAll":false}
      }'
    
    }
    
    #【配置5】 此处可根据服务器的实际情况,进行阈值调整
    function serverCheck(){
           if [[ "$cpuUsage" > 75 ]] || [[ "$diskUsage" >90 ]] || [[ "$mem_used_persent" > 90 ]];
    	then
       	 SendServerMessageToDingding
           fi
    }
    serverCheck
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    2、中间件监控

    #!/bin/bash
    
    #【配置1】中间件端口设置
     Port_Nginx="80"
     Port_MySQL="3306"
    #...此处省略多个端口,可添加该服务器上的其他中间件配置
    # Port_Nacos="xxx"
    # Port_ElesticSearch="xxx"
     
    #【配置2】网卡配置(可选),此处配置的是想要展示的ip地址,使用ifconfig查看inet对应的ip
    ifconfig="eth0"
    
    #【配置3】要@的人员手机号码,此处的手机号必须和钉钉上的一致
     user="17858888888"
    # user1="13888888888"
    # user2="XXXX"
    
    #主机信息
     Date=`date +%Y-%m-%d`
     Date_time=`date "+%Y-%m-%d--%H:%M:%S"`
     Host_name=`hostname`
     IP_addr=`ifconfig $ifconfig | grep "inet" |awk 'NR==1{ print $2}'`
    
    #【配置4】中间件监控项
     Nginx_status=`netstat -lntup |grep -w "$Port_Nginx" |wc -l`':Nginx'
     MySQL_status=`netstat -lntup |grep -w "$Port_MySQL" |wc -l`':MySQL'
    #...此处省略多项,按照自己需求配置即可,同上
    # flink_status=`netstat -lntup |grep -w "$Port_flink" |wc -l`':flink'
     
    #【配置5】钉钉webhook,此处为添加的钉钉机器人webhook,当前为已经添加使用的webhook
    Dingding_Url="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxx"
     
    #【配置6】应用挂机-发送钉钉消息,消息内容可修改
    # at中atMobiles为数组结构,可添加上面配置的user1、user2等,可根据不同的业务@指定的人员,isAtAll是否@所有人设置
    function SendDownMessageToDingding(){
    curl -s "${Dingding_Url}" -H 'Content-Type: application/json' -d "
    {
     'msgtype': 'text',
     'text': {'content': '服务监控\n$1服务down,请尽快处理!\n巡查时间:${Date_time}\nIP地址:${IP_addr}\n'},
     'at': {'atMobiles': ['${user}'],  'isAtAll': false}
      }"
    
    }
    
    #【配置7】应用恢复-发送钉钉消息,消息内容可修改
    # at中atMobiles为数组结构,可添加上面配置的user1、user2等,可根据不同的业务@指定的人员,isAtAll是否@所有人设置
    function SendUpMessageToDingding(){
    curl -s "${Dingding_Url}" -H 'Content-Type: application/json' -d "
    {
     'msgtype': 'text',
     'text': {'content': '服务监控\n$1服务已恢复正常运行!\n巡查时间:${Date_time}\nIP地址:${IP_addr}\n'},
     'at': {'atMobiles': ['${user}'],  'isAtAll': false}
      }"
    
    }
    
    #【配置8】 log path,将消息记录到指定日志目录
    log_path="/home/logs"
    
    #【配置9】遍历 --此处要配置【中间件】服务的信息,根据情况在in{$xxx,$yyy.....}中进行添加中间件
    for i in {$Nginx_status,$MySQL_status}
    do
    	statcode=`echo $i | awk -F ':' '{print $1}'`
    	name=`echo $i | awk -F ':' '{print $2}'`
    	old_statcode=`head -n 1 ${log_path}/${name}.log`
        if [ $statcode -lt 1 ]
        then
    		if [ $old_statcode -lt 1 ]
    		then echo "[ERROR] $name is still stopped! Status_code=$statcode"
    		else
    			echo "[ERROR] $name is stopped! Status_code=$statcode"
    			SendDownMessageToDingding $name
            fi
        else
    		if [ $old_statcode -ge 1 ]
    		then echo "[INFO] $name is still running normally! Status_code=$statcode"
    		else
    			echo "[INFO] $name returned to normal function! Status_code=$statcode"
    			SendUpMessageToDingding $name
            fi
        fi
        echo $statcode > ${log_path}/${name}.log
    done
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
  • 相关阅读:
    Go学习第十一章——协程goroutine与管道channel
    101. Go单测系列1---使用monkey打桩
    C. Peaceful Rooks(并查集找环)
    mysql,redis导入导出数据库数据
    第5章 dockerfile
    Linux中的五种网络API的模型的解释
    Git的下载安装和启动(win10)
    敏感词在线检测-敏感词在线检测工具
    阿里云国际站如何进行实名登记?
    力扣刷题:169. 多数元素
  • 原文地址:https://blog.csdn.net/weixin_38801572/article/details/126501158