监控指定进程的句柄信息
脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| #!/bin/bash
cd `dirname $0`
keyInfo=$1 proc_num="" sleep_idle=2 outSeq=1 procInfoInt=20
startTime=0
function GetProcStartTime() { local PID=$1 if [ -z ${PID} ] then echo "usage ${0} pid" return 0 fi local STARTTIME=$(awk '{print int($22 /100)}' /proc/$PID/stat) local UT=$(awk '{print int($1)}' /proc/uptime) local NOW=$(date +%s) startTime=$((NOW - (UT - STARTTIME))) echo "proc $PID start at : `date -d @$startTime`" }
function GetLatestPid() { proc_num_all=(`ps -ef |grep "${keyInfo}" |grep -v grep |awk '{print $2,$8}' |grep "${keyInfo}" |awk '{print $1}'`) proc_num=${proc_num_all[@]} for tmpPid in "${proc_num_all[@]}" do oldTime=${startTime} GetProcStartTime ${tmpPid} if [ ${oldTime} -lt ${startTime} ] then proc_num=${tmpPid} fi done }
function CheckKeyInfo() { if [ "-" == "-${keyInfo}" ] then echo "must input param" exit 0 else echo "${keyInfo}" fi }
CheckKeyInfo GetLatestPid
while true do sleep ${sleep_idle} if [ ! -d /proc/${proc_num} ] then echo "proc ${proc_num} is dead" else proInfo=`ls /proc/${proc_num}/fd -l 2>&1 |awk ' BEGIN {sum=0; sock=0; efd=0; ep=0; fd=0;} { sum += 1; if($0~"socket") { sock+=1; } else if($0~"eventfd") { efd+=1; } else if($0~"eventpoll") { ep+=1; } else { fd+=1; } } END {print "total_fd="sum, "sock_num="sock, "eventfd_num="efd, "eventpool_num="ep, "file_fd="fd }' ` vmInfo=`cat /proc/${proc_num}/status |awk 'BEGIN{vm=""; rss="";} { if($0~"VmSize") vm=$2$3 fi; if($0~"VmRSS") rss=$2$3 fi;} END {print "VmSize="vm, "VmRSS="rss}'` echo "`date "+%Y-%m-%d %T"` pid=${proc_num} ${proInfo} ${vmInfo}" outSeq=$((${outSeq}+1)) if [ $(( $outSeq % ${procInfoInt} )) -eq 0 ] then GetProcStartTime ${proc_num} fi
fi done exit 0
|