编辑代码

#!/bin/bash
#监控服务器Cpu、Memory达到某个阀值之后,记录进程、线程、线程堆栈、GC日志、内存Dump,并且上报告警。
#价值:第一时间保留现场,减轻排查问题的复杂度。
now=`date -u -d"+8 hour" +'%Y-%m-%d-%H-%M-%S'`
#日志文件
log_dir=/usr/local/yunji/logs/sysmonitor
log_file=$log_dir"/sysmonitor-$now".log
#cpu use threshold
cpu_warn='0'
 #mem idle threshold
mem_warn='1'
 #disk use threshold
disk_warn='90'

#不存在则创建目录
if [ ! -d $log_dir  ];then 
  mkdir -p $log_dir
fi

#监控核心函数
monitor_core_func(){
    #1、记录top10进程
    echo -e "\n1、top10进程明细:" >> $log_file
    ps -eo user,pid,pcpu,pmem,vsz,rss,stat,start,time,command --sort=-pcpu  |head -n 10 >> $log_file
    #2、记录java线程堆栈
    for pid in `ps -eo user,pid,pcpu,pmem,vsz,rss,stat,start,time,command --sort=-pcpu  |head -n 10 | grep "java" | grep "applicationName" |awk '{print $2}'`; do
        #记录线程详细
        echo -e "\n2、Java进程对应的线程使用明细:" >> $log_file
        ps p $pid -L -o pcpu,pmem,pid,tid,time,tname,cmd  >> $log_file
        #线程堆栈
        echo -e "\n3、Java进程对应的线程堆栈信息:" >> $log_file
        jstack -l $pid >> $log_file

            #4、GC日志
        echo -e "\n4、输出GC信息:" >> $log_file
        jstat -gc $pid |  sed -n '1,5p' >> $log_file
        jstat -gcutil $pid |  sed -n '1,5p' >> $log_file

        #5、内存dump
        echo -e "\n4、输出内存dump信息:" >> $log_file
        echo -e "请查看文件:$log_dir/dump_$pid.bin" >> $log_file
        jmap -dump:live,format=b,file="$log_dir/dump_$pid".bin $pid
    done
}

#---cpu
item_cpu () {
    cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $8}'|cut -f 1 -d "."`
    cpu_use=`expr 100 - $cpu_idle`
    echo "$now 当前Cpu利用率为:$cpu_use" >> $log_file
    if [ $cpu_use -gt $cpu_warn ]
        then
            echo "CPU超过阀值,请及时处理,明细如下:" >> $log_file
			
            #执行监控核心函数
            monitor_core_func

            #飞书告警
            json='{"msg_type":"post","content":{"post":{"zh_cn":{"title":"monitor","content":[[{"tag":"text","text":"test cpu warning'${cpu_use}'"}]]}}}}'
            curl -X POST -H "Content-Type: application/json" -d "$json"  http
        else
            echo "cpu ok!!!"
    fi
}
#---mem
item_mem () {
    #MB units
    mem_free=`free -m | grep "Mem" | awk '{print $4+$6}'`
    echo "$ now the current memory space remaining $ {mem_free} MB" >> /opt/mem.log
    if [ $mem_free -lt $mem_warn  ]
        then
            echo "内存使用率小于阀值,请及时处理,明细如下:" >> $log_file
			
            #执行监控核心函数
            monitor_core_func

            #飞书告警
            json='{"msg_type":"post","content":{"post":{"zh_cn":{"title":"monitor","content":[[{"tag":"text","text":"test cpu warning'${cpu_use}'"}]]}}}}'
            curl -X POST -H "Content-Type: application/json" -d "$json"  http
        else
            echo "mem ok!!!"
    fi
}
#---disk
item_disk () {
    disk_use=`df -P | grep /dev | grep -v -E '(tmp|boot)' | awk '{print $5}' | cut -f 1 -d "%"`
    echo "$ now current disk usage is $ disk_use" >> /opt/disk.log
    if [ $disk_use -gt $disk_warn ]
        then
            echo "disk warning!!!"
        else
            echo "disk ok!!!"
    fi
}
item_cpu
item_mem
item_disk