使用shell腳本監控少量服務器並發送微信告警信息


01. 概括

1.0 腳本更新地址
Git更新地址:https://git.mairoot.com/mai/mairoot/blob/master/monitor/shell_monitor_script.sh
文章原文地址:使用shell腳本監控少量服務器並發送微信告警信息
1.1 前提: 平台系統:linux系統下 接收信息:微信企業號 1.2 腳本說明 需要修改微信接口 腳本對應參數的修改:包括IP,告警閾值等 1.3 腳本使用 該腳本監控包括Disk、CPU、MEM、LOAD等主機資源,以及docker服務和docker容器。 將該腳本附件假定放於:/home/mai/.check_host.sh。 那么在定時任務上可以增加定時任務: $ echo "## 每分鍾執行監控腳本一次" | sudo tee -a /etc/crontab $ echo "*/1 * * * * mai bash /home/mai/.check_host.sh" | sudo tee -a /etc/crontab

02. 腳本附件

#!/bin/bash

#!/bin/bash

# Create for mai
 # Copyright http://www.mairoot.com
 # Create date 2018-07-21
 # Using check host source
 # Noting delete content
 # Shell Option $@

# 01.獲取主機資源
function sys_info()
{
 # 系統信息
 Date=`date +%Y-%m-%d`
 Date_time=`date "+%Y-%m-%d__%H:%M:%S"`
 Host_name=`hostname`
 IP_net_dev="ens33"
 IP_addr=`ifconfig $IP_net_dev|grep "inet addr"|awk -F":" '{print $2}'|awk -F" " '{print $1}'`
 # 主機資源
 Disk_rate_sys=`df -h|grep \/\$|awk -F" " '{ print $5 }'`
 Disk_rate_sys2=${Disk_rate_sys%%%}
 Disk_rate_data=`df -h|grep \/boot\$|awk -F" " '{ print $5 }'`
 Disk_rate_data2=${Disk_rate_data%%%}
 CPU_free=`vmstat |tail -1|awk -F" " '{print $15}'`
 Load_ave15=`uptime |awk '{ print $NF }'|awk -F" " '{ print $1 }'`
 Load_ave15_1=`expr $Load_ave15`
 Mem_Total_kb=`cat /proc/meminfo | grep "MemTotal"|awk -F":" '{print $2}'|awk '{print $1}'`
 Mem_Free_kb=`cat /proc/meminfo | grep "MemFree"|awk -F":" '{print $2}'|awk '{print $1}'`
 Mem_Total=`expr $Mem_Total_kb / 1024`
 Mem_Free=`expr $Mem_Free_kb / 1024`
 # 微信接口
 CropID='ww4730ead71a1818a6' 
 Secret='1Nu6vcloj8SGzs6XqsIhuZVk1lO3khVS1j_GY6XEbFo' 
 GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret" 
 Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
 PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
 To_User="mairoot"
 To_Party="1"
 Agent_ID="1000001"
 # 日志目錄
 if [ ! -d "/tmp/logs_check" ]; then mkdir /tmp/logs_check; fi
 Logs_file='/tmp/logs_check'
 # 遠程地址
 SSH_addr="192.168.3.12:22"
 # 運行業務
 Project_mode="測試機"
}

# 02.主機資源磁盤、CPU、MEM、LOAD
# 2.1 判斷根磁盤使用率超額
  #系統盤使用率
function sys_disk()
{
if [ $Disk_rate_sys2 -gt 80 ]
 then
  echo "$Date_time 磁盤使用率超額" >> $Logs_file/disk_rate.$Date.log
  /usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'磁盤使用:目錄/為${Disk_rate_sys}'"},"safe":"0"}' $PURL
 else
  echo "$Date_time 磁盤使用率良好:$Disk_rate_sys" >> $Logs_file/disk_rate.$Date.log
 fi

  #數據盤使用率
if [ $Disk_rate_data2 -gt 80 ]
 then
  echo "$Date_time 磁盤使用率超額" >> $Logs_file/disk_rate.$Date.log
  /usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'磁盤使用:目錄/data為${Disk_rate_data}'"},"safe":"0"}' $PURL
 else
  echo "$Date_time 磁盤使用率良好:$Disk_rate_data" >> $Logs_file/disk_rate.$Date.log
 fi
}

# 2.2 判斷MEM使用
function sys_mem()
{
 if [ $Mem_Free_kb -lt 102400 ]
 then
  echo "$Date_time MEM空閑少於100M" >> $Logs_file/MEM_free.$Date.log
  /usr/bin/curl --data-ascii '{ "touser":  "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'內存總共:${Mem_Total}MB'\n'內存剩余:${Mem_Free}MB'"},"safe":"0"}' $PURL
 else
  echo "$Date_time MEM空閑良好:$Mem_Free" >> $Logs_file/MEM_free.$Date.log
 fi
}

# 2.3 判斷CPU空閑值過低
function sys_cpu()
{
 if [ $CPU_free -lt 10 ]
 then
  echo "$Date_time CPU空閑率少於10%" >> $Logs_file/CPU_free.$Date.log
  /usr/bin/curl --data-ascii '{ "touser":  "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'CPU空閑:${CPU_free}%'"},"safe":"0"}' $PURL
 else
  echo "$Date_time CPU空閑率良好:$CPU_free%" >> $Logs_file/CPU_free.$Date.log
 fi
}

# 2.4 判斷服務器15分鍾負載過高
function sys_load()
{
 if [ `expr $Load_ave15_1 \> 0` -gt 1 ]
 then
  echo "$Date_time 服務器15分鍾負載過高:$Load_ave15%" >> $Logs_file/Load_ave15.$Date.log
  /usr/bin/curl --data-ascii '{ "touser":  "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'主機負載:${Load_ave15}%'"},"safe":"0"}' $PURL
 else
  echo "$Date_time 服務器15分鍾負載良好:$Load_ave15%" >> $Logs_file/Load_ave15.$Date.log
 fi
}

# 03.檢查服務
# 3.1 檢查docker服務存活
function docker_status()
{
ps -ef|grep docker |grep -v grep
if [ $? -eq 0 ]
then
        Date_time311=`date "+%Y-%m-%d__%H:%M:%S"`
        echo "$Date_time311:docker is up" >> $Logs_file/Docker_pro.$Date.log 
else
                Date_time312=`date "+%Y-%m-%d__%H:%M:%S"`
                echo "$Date_time312:Docker服務第一次停止" >> $Logs_file/docker.$Date.log
                /usr/bin/curl --data-ascii '{ "touser": "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time312}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'發生事件:Docker第一次停止'"},"safe":"0"}' $PURL
        service docker start
        Os_code=$?
        if [ $Os_code -eq 0 ]
        then
                Date_time313=`date "+%Y-%m-%d__%H:%M:%S"`
                echo "$Date_time313:Docker_rec is up" >> $Logs_file/docker.$Date.log 
                /usr/bin/curl --data-ascii '{ "touser":  "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time313}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'發生事件:Docker服務恢復'"},"safe":"0"}' $PURL
        elif [ $Os_code -ne 0 ]
        then
                Date_time314=`date "+%Y-%m-%d__%H:%M:%S"`
                echo "$Date_time314:Docker重啟失敗" >> $Logs_file/docker.$Date.log
                /usr/bin/curl --data-ascii '{ "touser":  "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time314}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'發生事件:Docker服務停止'"},"safe":"0"}' $PURL
        fi
fi
}

# 3.2 檢查docker容器存活
 # docker Container_ID 自下向上
function docker_container()
{
#Container_ID_ALL=("2ac5dfa2cd4e" "36c6485bf415" "a2a46bfde7bb" "3ad69c74ef9c")
#Container_ID_ALL="`docker ps -aq`"
Container_ID_ALL="`docker ps -q`"
for Container_ID in ${Container_ID_ALL[@]}
do
    Container_Name=`docker inspect -f='{{.Name}}' $(docker ps -a -q|grep $Container_ID)|awk -F"/" '{print $2}'`
    docker ps |grep $Container_ID
    if [ $? -eq 0 ]
    then
        Date_time321=`date "+%Y-%m-%d__%H:%M:%S"`
        echo "$Date_time321:$Container_Name is up" >> $Logs_file/Docker_Container.$Date.log 
    else
        docker start $Container_ID
        Os_code=$?
        if [ $Os_code -eq 0 ]
        then
                Date_time322=`date "+%Y-%m-%d__%H:%M:%S"`
                echo "$Date_time322:$Container_Name is up" >> $Logs_file/Docker_Container.$Date.log 
                /usr/bin/curl --data-ascii '{ "touser":  "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time322}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'發生事件:${Container_Name}服務恢復'"},"safe":"0"}' $PURL
        elif [ $Os_code -ne 0 ]
        then
                Date_time323=`date "+%Y-%m-%d__%H:%M:%S"`
                echo "$Date_time323:$Container_Name重啟失敗" >> $Logs_file/Docker_Container.$Date.log
                /usr/bin/curl --data-ascii '{ "touser":  "'${To_User}'", "toparty": "'${To_Party}'","msgtype": "text","agentid": "'${Agent_ID}'","text": {"content": "'獲取時間:${Date_time323}'\n'運行業務:${Project_mode}'\n'遠程地址:${SSH_addr}'\n'內網地址:${IP_addr}'\n'主機名稱:${Host_name}'\n'發生事件:${Container_Name}服務停止'"},"safe":"0"}' $PURL
        fi
    fi
done
}

# 10 調用函數
sys_info
sys_disk
sys_cpu
sys_mem
sys_load
docker_status
docker_container

03. 微信接收信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM