<
java-dump
>
上一篇

各类实用小玩意
下一篇

删除docker image

java-dump

当主机cpu或者内存到触发值的时候 自动dump程序的一些信息用于查问题 不过当内存不够的时候 dump内存有风险down掉

zabbix 动作里面 加个触发器 然后远程执行命令就好了 记得给zabbix用户sudo权限

给脚本执行权限

#!/bin/bash

Hostname=`hostname`
dir=/tmp/${Hostname}_java

if [ ! -d ${dir} ];then
mkdir ${dir}
chmod 777 ${dir}
else
chmod 777 ${dir}
fi

pid=`ps aux|grep java|sort -nrk 3|head -n 1|awk '{print $2}'`
user=`ps aux|grep java|sort -nrk 3|head -n 1|awk '{print $1}'`

touch ${dir}/gc_info
if [ "$user" == "jenkins" ];then
sudo -u jenkins /usr/java/jdk/bin/jstat -gcutil $pid > ${dir}/gc_info
sudo -u jenkins /usr/java/jdk/bin/jmap -dump:format=b,file=${dir}/${Hostname}_dump $pid
else
sudo /usr/java/jdk/bin/jstat -gcutil $pid > ${dir}/gc_info
sudo /usr/java/jdk/bin/jmap -dump:format=b,file=${dir}/${Hostname}_dump $pid
fi

top_spid=`ps H -eo %cpu,pid,tid |grep -w $pid|sort -nr |head -n 10|grep -v '^ 0\.'`

if [ -n "$top_spid" ];then
spids=`echo "$top_spid"|awk '{print $3}'`
touch ${dir}/all_thread_info
if [ "$user" == "jenkins" ];then
sudo -u jenkins /usr/java/jdk/bin/jstack $pid  > ${dir}/all_thread_info
else
sudo /usr/java/jdk/bin/jstack $pid  > ${dir}/all_thread_info
fi
echo "">${dir}/top_cpu_consume_thread
echo $top_spid >>${dir}/top_cpu_consume_thread
for spid in ${spids[@]};do
        spid_2=`printf "%x\n" $spid`
        cat ${dir}/all_thread_info |sed '/'nid=0x"$spid_2"'/,/^$/!d' >> ${dir}/top_cpu_consume_thread
done

cat ${dir}/all_thread_info |grep java.lang.Thread.State|awk -F ':' '{print $2}'|sort -n|uniq -c|sort -nr > ${dir}/tid_state
fi
Top
Foot