当主机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