#!/bin/sh
#错误捕捉
log="./WaiGua_collector_process_`date +%Y%m%d`.log"
ErrTrap()
{
Retn_code=$?
v_PID=$3
v_PPID=$4
echo "[`date +%Y-%m-%dT%H:%M:%S`]Cmd=$1, Line#=$2, PID=$v_PID, PPID=$v_PPID, Retn_code=$Retn_code" >> ${log}
}
trap 'ErrTrap $0 $LINENO $$ $PPID' ERR
#获取命令行参数
while getopts :s:d:f: OPTION
do
case ${OPTION} in
s)
servIP=${OPTARG}
;;
d)
datapath=${OPTARG}
;;
f)
filterfile=${OPTARG}
;;
\?)
echo "Usage:WaiGua_collector_process.sh -s serviceIP -d datafilepath [-f filterfile]";
exit 1;
;;
esac
done
if [ -z "${servIP}" ] || [ -z "${datapath}" ] ; then
echo "Usage:WaiGua_collector_process.sh -s serviceIP -d datafilepath [-f filterfile]"
exit 1;
fi
#获取脚本保存路径baseDir####################################
baseDir=`echo ${0}|awk 'BEGIN {FS="/"}{if(NF>1){for(i=1;i<NF;++i){path=path$i"/";}}else{path="./"}}END {print path}'`
cd ${baseDir}
baseDir=`pwd`
#加载环境变量
if [ -f "${HOME}/.profile" ] ; then
. ${HOME}/.profile
fi
#根据系统选取正确命令和路径,同时做必要的初始化操作
#osType:操作系统类型
#cronCmdBase:crontab命令基本部分
#cronPrivFilePath:cron.allow和cron.deny的目录
osType=`uname`
case ${osType} in
"AIX")
cronCmdBase="sudo crontab -l ";
cronPrivFilePath="/var/adm/cron/";
psCmdBase="ps -eo ruser,args|sort|grep -v 'RUSER COMMAND'|grep -v sort";
;;
"SunOS")
cronCmdBase="sudo crontab -l ";
cronPrivFilePath="/etc/cron.d/";
psCmdBase="ps -eo ruser,args|sort|grep -v 'RUSER COMMAND'|grep -v sort";
;;
"HP-UX")
cronCmdBase="sudo crontab -l ";
cronPrivFilePath="/usr/lib/cron/";
export UNIX95=;
psCmdBase="ps -eo ruser,args|sort|grep -v 'RUSER COMMAND'|grep -v sort";
;;
"Linux")
cronCmdBase="sudo crontab -l -u ";
cronPrivFilePath="/etc/";
psCmdBase="ps -ww -eo ruser,args|sort|grep -v 'RUSER COMMAND'|grep -v sort";
;;
*)
echo "Unkown operating system!!"
exit 1;
;;
esac
#拼接获取用户列表的命令
if [ -f "${cronPrivFilePath}/cron.allow" ] ; then
getuserCmd="cat ${cronPrivFilePath}/cron.allow";
elif [ -f "${cronPrivFilePath}/cron.deny" ] ; then
getuserCmd="cat /etc/passwd|awk '{FS=\":\"}{print \$1}'"
else
getuserCmd="echo \"root\""
fi
timestamp=`date +"%Y%m%d%H%M%S"`
datafile="`hostname`_WaiGua_process_${timestamp}.tok"
hostName=`hostname`
#获取各用户crontab调度计划
echo ${getuserCmd}|sh|while read userName
do
echo "${cronCmdBase} ${userName} 2>/dev/null|grep -v ^#|grep -v ^$"|sh|
while read cronCmd
do
procName=`echo "${cronCmd}"|awk '{print $6}'`
procPara=`echo "${cronCmd}"|awk 'BEGIN{FS=" "}{pp="";for(i=7;i<NF;++i){pp=pp$i" ";};pp=pp$NF;}END{print pp}'`
execPlan=`echo "${cronCmd}"|awk 'BEGIN{FS=" "}{ep="";for(i=1;i<=5;++i){ep=ep$i" ";}}END{print ep}'`
# procNum=`ps -ef|grep "${procName}"|grep -v grep|wc -l|sed 's/ //g'`
procNum=0
resCode="${hostName}_HW_${procName}"
if [ -n "${procPara}" ] ; then
resCode="${resCode} ${procPara}"
fi
resCode="${resCode}_${userName}"
echo "${resCode}|HOST_NAME_PROC|${hostName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|IP_ADDR_PROC|${servIP}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|HOST_USER_PROC|${userName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_NAME_PROC|${procName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_PARA_PROC|${procPara}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_NUM_PROC|${procNum}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|EXEC_PLAN_PROC|${execPlan}|${timestamp}" >> ${datapath}/${datafile}.tmp
done
done
#获取当前系统中的进程
#拼接完整的进程查找语句:根据过滤关键字配置文件补充命令
if [ -n "${filterfile}" ] ; then
while read FILTER
do
psCmdBase="${psCmdBase}|grep -v ${FILTER}"
done < ${filterfile}
fi
psresultfile="./psresult.$$.tmp"
psCmdBase="${psCmdBase}|grep -v grep > ${psresultfile}"
#执行命令,解析输出
echo ${psCmdBase}|sh
lastLine=""
procNum=0
while read LINE
do
#第一行数据
if [ -z "${lastLine}" ] ; then
lastLine=${LINE}
procNum=1
#用户、名称、参数都相同的进程,归到同一个结果中
elif [ "${lastLine}" == "${LINE}" ] ; then
procNum=`expr ${procNum} + 1`
else
userName=`echo ${lastLine}|awk '{print $1}'`
procName=`echo ${lastLine}|awk '{print $2}'`
procPara=`echo "${lastLine}"|awk 'BEGIN{FS=" "}{pp="";for(i=3;i<NF;++i){pp=pp$i" ";};pp=pp$NF;}END{print pp}'`
execPlan=""
resCode="${hostName}_HW_${procName}"
if [ -n "${procPara}" ] ; then
resCode="${resCode} ${procPara}"
fi
resCode="${resCode}_${userName}"
echo "${resCode}|HOST_NAME_PROC|${hostName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|IP_ADDR_PROC|${servIP}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|HOST_USER_PROC|${userName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_NAME_PROC|${procName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_PARA_PROC|${procPara}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_NUM_PROC|${procNum}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|EXEC_PLAN_PROC|${execPlan}|${timestamp}" >> ${datapath}/${datafile}.tmp
lastLine=${LINE}
procNum=1
fi
done < ${psresultfile}
#最后一个进程数据
userName=`echo ${lastLine}|awk '{print $1}'`
procName=`echo ${lastLine}|awk '{print $2}'`
procPara=`echo "${lastLine}"|awk 'BEGIN{FS=" "}{pp="";for(i=3;i<NF;++i){pp=pp$i" ";};pp=pp$NF;}END{print pp}'`
execPlan=""
resCode="${hostName}_HW_${procName}"
if [ -n "${procPara}" ] ; then
resCode="${resCode} ${procPara}"
fi
resCode="${resCode}_${userName}"
echo "${resCode}|HOST_NAME_PROC|${hostName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|IP_ADDR_PROC|${servIP}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|HOST_USER_PROC|${userName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_NAME_PROC|${procName}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_PARA_PROC|${procPara}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|PROCESS_NUM_PROC|${procNum}|${timestamp}" >> ${datapath}/${datafile}.tmp
echo "${resCode}|EXEC_PLAN_PROC|${execPlan}|${timestamp}" >> ${datapath}/${datafile}.tmp
if [ -f "${datapath}/${datafile}.tmp" ] ; then
mv ${datapath}/${datafile}.tmp ${datapath}/${datafile}
fi
rm ${psresultfile}
exit 0