#!/bin/bash SampleCount=600 required="pidstat vmstat iostat jmap" export PATH=$PATH:/opt/local/java/bin for cmd in ${required} do which ${cmd} >/dev/null 2>&1 ret=$? if [ ${ret} -ne 0 ]; then echo "Error: command ${cmd} not found.please install and set path variable." exit 1 fi done export LANG=en_US.UTF-8 cd `dirname $0` while getopts :d:c:sk OPTION do case $OPTION in d) if [ -z ${OPTARG} -o ${OPTARG} = "" ]; then echo "`basename $0`: invalid option -${OPTION} ${OPTARG}" echo "Try `basename $0` --help for more information." exit 1 fi delay=${OPTARG} ;; c) if [ -z ${OPTARG} -o ${OPTARG} = "" ]; then echo "`basename $0`: invalid option -${OPTION} ${OPTARG}" echo "Try `basename $0` --help for more information." exit 1 fi count=${OPTARG} ;; s) ps -ef|grep `basename $0`|grep -v grep|awk '{print $2}'|grep -v $$ |xargs kill -9 >/dev/null 2>&1 if [ -f vmstat.log ]; then BakDir=`stat vmstat.log|grep Access|grep -v Uid|awk -F"Access: " '{print $2}'|awk -F"." '{print $1}'|sed -e 's/-//g' -e 's/://g' -e 's/ //g'` else BakDir=`date +%Y%m%d%H%M%S` fi function backup() { for logfile in $* do if [ -f ${logfile} ]; then if [ ! -d "${BakDir}" ]; then mkdir -p "${BakDir}" fi mv ${logfile} ${BakDir} fi done } backup vmstat.log iostat.log vmstat ${delay} ${count} >> vmstat_${HOSTNAME}.log & iostat -d ${delay} ${count} >> iostat_${HOSTNAME}.log & for pid in `pidof java memcached mysqld` do pname=`ps -ef|grep ${pid}|grep -v grep|awk -v p=${pid} '$2==p {print $8}'` ptype=${pname##*/} if [ "${ptype}" = "java" ]; then pname=`ps -ef|grep ${pid}|grep ${ptype}|grep -v grep|awk -F'-Dname=' '{print $2}'|awk '{print $1}'` if [ "${pname}" = "" ]; then pname=java${pid} echo "Warning: not found process name of pid: ${pid} by '-Dname', data stored in [cpu|mem|jvm|vmsatat|iostat]_${pname}.log." fi else pname=${ptype} fi for file in cpu mem jvm heap do backup "${file}_${pname}.log" done # get sepcial process's cpu and mem usage pidstat -u -p ${pid} ${delay} ${count} >> cpu_${pname}.log & pidstat -r -p ${pid} ${delay} ${count} >> mem_${pname}.log & # get java heap usage if [ "${ptype}" = "java" ]; then heaplog=heap_${pname}.log echo "Time HeapUsed" > ${heaplog} for ((i=0;i<${count};i++)) do jmap -heap ${pid} |grep used|grep -v %|tail -5|head -4|awk 'BEGIN{sum=0}{sum=sum+$3}END{print strftime("%H:%M:%S",systime()),sum}' 1>>${heaplog} sleep ${delay} done 2>/dev/null & fi done ;; k) #if [ -z ${OPTARG} -o ${OPTARG} = "" ]; then # echo "`basename $0`: invalid option -${OPTION} ${OPTARG}" # echo "Try `basename $0` --help for more information." # exit 1 #fi #TimeStr="${OPTARG}" #if [ -d "${TimeStr}" ]; then # mv "${TimeStr}" "${TimeStr}.`date +%Y%m%d%H%M%S`" #fi #mkdir "${TimeStr}" #cp *.log "${TimeStr}" #cd "${TimeStr}" for f in *.log do fname=${f%.*} class=${fname%_*} module=${fname#*_} total=`wc -l ${f} |awk '{print $1}'` mod=$((total>SampleCount?total/SampleCount:1)) case "${class}" in cpu) prefix="ProcessCPU" grep : ${f} |grep -v Average|awk -v m=${mod} 'NR%m==0 {print $7}' > "${prefix}_${module}.stat" ;; mem) prefix="ProcessMEM" grep : ${f} |grep -v Average|awk -v m=${mod} 'NR%m==0 {print $7/1024}' > "${prefix}_${module}.stat" ;; heap) prefix="ProcessHeap" awk -v m=${mod} 'NR%m==0 {print $2/1024/1024}' ${f} > "${prefix}_${module}.stat" ;; vmstat) prefix="WholeADMSystem" TotalMem=`free|grep Mem|awk '{print $2}'` echo "CpuUsage(%) MemUsage(%)" > "${prefix}_${module}.stat" grep -v swpd ${f} |grep -v procs|awk -v total=${TotalMem} -v m=${mod} 'NR%m==0 {print 100-$15,(total-$4)/total*100}' >> "${prefix}_${module}.stat" ;; *) echo "${f} ignored." continue ;; esac done rm -f *_java[1-9]*.stat zip -rq log.zip *.log *.stat #cd - >/dev/null 2>&1 ;; *) echo "Usage: `basename $0` -d <delay> -c <count> -s|-k" exit 1 ;; esac done