采集linux进程资源SHELL例子

#!/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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值