美文网首页
shell脚本抓取堆栈信息

shell脚本抓取堆栈信息

作者: 秦海波 | 来源:发表于2021-11-15 10:52 被阅读0次

    由于服务器每周末特定时间出现CPU告警问题,出现时间比较短所以用脚本抓取信息

    1、shell脚本

    #!/bin/sh
    #加载环境变量
    . /etc/profile
    
    Date2=`date`
    Date=`date +%Y%m%d`
    base="/root/scripts"
    time=`date +%H:%M:%S`
    
    getPidInfo(){
        #echo "监控开始"
      #获取一次top指令去掉前面6行,判断第9列(CPU占用)大于一定数据,按照CPU排序,然后取第一条
        data=$(top -b -d 1 -n 1 -u root |awk '{ if (NR > 6) print }' |awk '{ if ($9 > 10) print }' | sort -rn -k +9 | head -1)
        array=(${data// / })
        if [[ ${#array[@]} -gt 1 ]];
            then
        echo "当前时间为:$Date2" >> $base/overlog$Date.log
            echo "当前CPU使用率为:${array[8]}" >> $base/overlog$Date.log
        echo "当前内存使用率为:${array[9]}" >> $base/overlog$Date.log
            echo "当前用户为:${array[1]}" >> $base/overlog$Date.log
        echo "当前进程为:${array[0]}" >> $base/overlog$Date.log
            echo "当前进程名称为:${array[11]}" >> $base/overlog$Date.log
            echo "当前进程使用的CPU时间总计为:${array[10]}" >> $base/overlog$Date.log
        echo "进程所在目录为:" >> $base/overlog$Date.log
        ls -l  /proc/${array[0]}/cwd* >> $base/overlog$Date.log
        echo "进程类型为:" >> $base/overlog$Date.log
        ls -l  /proc/${array[0]}/exe* >> $base/overlog$Date.log
    
        echo "当前线程对应进程信息" >> $base/overlog$Date.log
        top -b -d 1 -n 1 -H -p ${array[0]} |awk '{ if (NR > 6) print }'| sort -rn -k +9 >> $base/overlog$Date.log
        echo "当前堆栈信息开始:==================================================" >> $base/overlog$Date.log
        jstack ${array[0]} >> $base/overlog$Date.log
        echo "当前堆栈信息结束:==================================================" >> $base/overlog$Date.log
        #else
           # echo "CPU占有率状态正常" >> $base/overlog$Date.log
        fi
    }
    
    #echo $time
    #死循环执行到某个时间
    until [[ "$time" > "10:33:00" ]]
    do
        echo "当前时间:$time "  >> $base/overlog$Date.log
        getPidInfo
        sleep 1
        time=`date +%H:%M:%S`
        Date2=`date`
        #echo "当前实际时间为:$time"
    done
    echo "到时间了$time " >> $base/overlog$Date.log
    
    
    #给脚本加入可执行权限
    chmod +x time.sh
    

    2、定时任务crontab -e

    #输入命令
    crontab -e
    
    #进入编辑模式输入脚本加路径
    31 10 * * 3 /root/scripts/time.sh
    

    3、环境变量问题

    前期执行手动调用没有问题但是定时执行无法抓取到堆栈信息,后再脚本前面加入. /etc/profile后解决

    ##脚本头部加入. /etc/profile加载环境变量
    . /etc/profile
    

    相关文章

      网友评论

          本文标题:shell脚本抓取堆栈信息

          本文链接:https://www.haomeiwen.com/subject/hmzftrtx.html