linux监控java进程的cpu和线程快照脚本

java进程的cpu和线程快照一般都会接入监控平台进行监控和查看,也可以通过命令在服务器查看:top -b -n 1 -Hp pid > 1.top && jstack pid > 1.stack,当然也可以通过shell脚本的方式将cpu和jstack指标记录输出到文件。

#每隔5秒钟检测一下CPU,当超过90的时候连续采集10分钟的top、stack、cpuinfo、iostat
if [ ! -d "result" ]; then mkdir result; fi
num=1;
prefix=`date -d "today" +"%H%M%S"`;   #文件前缀
while true; do
        realCpu=`top -b -n 1 -Hp $1 | sed -n '3,3p' | awk '{print $2}'`
        printf $(date -d "today" +"%Y%m%d.%H:%M:%S")" CPU: "$realCpu;
        CpuStatus=`echo $realCpu | awk '{if($0 > 90 ) print "high"; else print "low"}'`;    #注意这里设置阈值
        if [ $CpuStatus == "high" ]; then
                printf ", 大于90,开始采集10分钟堆栈..."
                for ((i=1;i<=120;i++)); do
                        top -b -n 1 -Hp $1 > ./result/$prefix-$num-"top"-$(date -d "today" +"%Y%m%d_%H%M%S").txt && jstack $1 > ./result/$prefix-$num-"stack"-$(date -d "today" +"%Y%m%d_%H%M%S").txt && cat /proc/cpuinfo > ./result/$prefix-$num-"cpuinfo"-$(date -d "today" +"%Y%m%d_%H%M%S").txt && iostat -x > ./result/$prefix-$num-"iostat"-$(date -d "today" +"%Y%m%d_%H%M%S").txt;
                        num=$(($num+1));
                                                if [ $i -lt 120 ]; then sleep 5; fi
                done
        fi
                printf "\n";
        find ./result/ -cmin +1440 -type f -exec rm -rf {} \;   #删除24小时前的文件
        sleep 5;
if [ ! -d "result" ]; then mkdir result; fi
num=1;
prefix=`date -d "today" +"%H%M%S"`;   #文件前缀
while true; do
        realCpu=`top -b -n 5 -d 1 -Hp $1 | grep Cpu | tail -1 | awk '{print $2}'`    #每隔1秒输出一次top,连续5次,取最后一次判断CPU,耗时5秒
        printf $(date -d "today" +"%Y%m%d.%H:%M:%S")" CPU: "$realCpu;
        CpuStatus=`echo $realCpu | awk '{if($0 > 90 ) print "high"; else print "low"}'`;    #注意这里设置阈值,阈值是90%
        if [ $CpuStatus == "high" ]; then 
                printf ", 大于90,开始采集10分钟堆栈..."
                for ((i=1;i<=120;i++)); do
						top -b -n 5 -d 1 -Hp $1 > top.tmp;    #每隔1秒输出一次top,连续5次,耗时5秒
						lastLine=`grep -n "top -" top.tmp | tail -1 |awk -F ':' '{print $1}'`;
                        echo $lastLine | xargs -I {} sed -n '{},$p' top.tmp > ./result/$prefix-$num-"top"-$(date -d "today" +"%Y%m%d_%H%M%S").txt && jstack $1 > ./result/$prefix-$num-"stack"-$(date -d "today" +"%Y%m%d_%H%M%S").txt;
                        num=$(($num+1));
                done
        fi
		printf "\n";
        find ./result/ -cmin +300 -type f -exec rm -rf {} \;   #删除5小时前的文件
done

使用说明:

chmod 777 top.sh (上面的脚本);执行nohup ./top.sh pid & 
如果打堆栈的话会在当前目录下面新建result文件夹,只保留1天的;
如果有重启java进程的话这个脚本也需要重启,因为pid改变了。

你可能感兴趣的:(linux,java,top命令,jstack命令,监控)