以下shell脚本,通过预先放置在服务器中,出现资源过高时,可直接运行,便于捕捉程序快照。文件捕捉完成后,直接打包成对应压缩包。
#!bin/bash/
################ 变量 #############
#项目路径
tomcatTestPath="/home/tomcat/apache-tomcat-7.0.79-http-test"
tomcatPath="/home/tomcat/apache-tomcat-7.0.79-http"
jdkPath="/usr/jdk"
#时间格式
dateFormat="+%Y-%m-%d %H:%M:%S"
#日志路径
logDir0="/home/jvmLog"
#昨天的日期
nowTime=`date "+%Y-%m-%d_%H:%M:%S"`;
###################################
#建文件夹
logDir="$logDir0/$nowTime"
mkdir $logDir;
if [ ! -n "$1" ] ;then
#查询进程号
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v 'grep' | grep -v $tomcatTestPath | awk '{print $2}'`
echo -e http服务的进程号=$pid
else
pid="$1"
echo -e "获取传入pid=" $pid
fi
cd $jdkPath/bin
#输出端口号的服务信息
ps -ef | grep $pid > $logDir/severInfo`date "+%Y-%m-%d %H:%M:%S"`.txt
###--------------------------------------------------------
echo -e "---top"
top -n1 > $logDir/topLog`date "+%Y-%m-%d %H:%M:%S"`.txt;
sleep 5;
top -n1 > $logDir/topLog`date "+%Y-%m-%d %H:%M:%S"`.txt;
###--------------------------------------------------------
echo -e "---jstack"
./jstack -l $pid >$logDir/jstackLog`date "+%Y-%m-%d %H:%M:%S"`.txt;
sleep 5;
./jstack -l $pid >$logDir/jstackLog`date "+%Y-%m-%d %H:%M:%S"`.txt;
###--------------------------------------------------------
echo -e "---jstat"
./jstat -gcutil $pid 1000 15 > $logDir/jstatLog`date "+%Y-%m-%d %H:%M:%S"`.txt;
sleep 5;
./jstat -gcutil $pid 1000 15 > $logDir/jstatLog`date "+%Y-%m-%d %H:%M:%S"`.txt;
###--------------------------------------------------------
echo -e "---jmap"
./jmap -dump:live,format=b,file=$logDir/problem`date "+%Y-%m-%d_%H:%M:%S"`.bin $pid
sleep 5;
./jmap -dump:live,format=b,file=$logDir/problem`date "+%Y-%m-%d_%H:%M:%S"`.bin $pid
#压缩文件
echo -e "---压缩文件夹"
tar -zcvPf $logDir.tar.gz $logDir