进程管理shell

#!/bin/ksh
INFORMIXDIR=/u1/informix;export INFORMIXDIR
INFORMIXSERVER=on_shm01;export INFORMIXSERVER
ONCONFIG=onconfig.on_01;export ONCONFIG
DB_LOCALE=zh_cn.gb;export DB_LOCALE
CLIENT_LOCALE=zh_cn.gb;export CLIENT_LOCALE
SERVER_LOCALE=zh_cn.gb;export SERVER_LOCALE
DBLANG=zh_cn.gb;export DBLANG
PATH=$INFORMIXDIR/bin:$PATH;export PATH
DBDATE=Y4MD/;export DBDATE
cd /u1/usr/informix
if [ $# -ne 1 ] ; then
   echo "Usage: killidle.sh idletime "
   echo "Ex: killidle.sh 1800 "
   exit fi
idle=$1
cp kill.log k.log
rm -rf kill.log
now=date | awk '{ print $4 }'
kill_time=date '+%y/%m/%d-%H:%M:%S'
echo "Start killtime:$kill_time"
echo "Start killtime:$kill_time" >>kill.log
#PUM=onstat -u | grep active | awk '{print $1}'
PNUM=w | grep fglrun | wc -l
#if [ PNUM -lt 155 ]; then
#   echo "User number less then 155,now is: $PNUM" >>kill.log       
#   echo "End Kill---------" >>kill.log
#   exit                                                                       
#fi
tsNow=0
hhn=echo $now | cut -d':' -f 1
mmn=echo $now | cut -d':' -f 2
ssn=echo $now | cut -d':' -f 3
tsNow=expr  $hhn \* 3600 +  $mmn \* 60 + $ssn
ToSec() {
# $1 : readtime
hh1=echo $1 | cut -d':' -f 1
mm1=echo $1 | cut -d':' -f 2
ss1=echo $1 | cut -d':' -f 3
ts1=expr  $hh1 \* 3600 +  $mm1 \* 60 + $ss1
# $2 : writetime
hh2=echo $2 | cut -d':' -f 1
mm2=echo $2 | cut -d':' -f 2
ss2=echo $2 | cut -d':' -f 3
ts2=expr  $hh2 \* 3600 +  $mm2 \* 60 + $ss2
if [ ts1 -gt ts2 ] ;
   then
   ts=expr $tsNow - $ts1
else
   ts=expr $tsNow - $ts2
fi
}
ToSes() {
hh3=echo $1 | cut -d':' -f 1
mm3=echo $1 | cut -d':' -f 2
ss3=echo $1 | cut -d':' -f 3
ts3=expr  $hh3 \* 3600 +  $mm3 \* 60 + $ss3
hh4=echo $2 | cut -d':' -f 1
mm4=echo $2 | cut -d':' -f 2
ss4=echo $2 | cut -d':' -f 3
ts4=expr  $hh4 \* 3600 +  $mm4 \* 60 + $ss4
if [ ts3 -gt ts4 ] ;
   then
   ts5=expr $tsNow - $ts3
else
   ts5=expr $tsNow - $ts4
fi
}
i=0
cnt=1
p_flag=1
sesID=""
opnetime=""
readtime=""
writetime=""
onstat -g ses > ifx_u.tmp
for f in onstat -g ntt | grep sqlexec | awk '{ print $3,$4,$5,$6 }'
do
  i=expr $i + 1
  case $i in
    1) sesID=$f
       ;;
    2) pentime=$f
       ;;
    3) readtime=$f
       ;;
    4) writetime=$f
       if [ $writetime ] ;
       then
          writetime=$writetime
        else
          writetime=$readtime
       fi
       ToSec $readtime $writetime
       if [ $ts -gt $idle ] ;
       then
         echo "$cnt) 进程号:$sesID,读:$readtime,写:$writetime,停滞:$ts,规定:$idle Sec."  >>kill.log
         while read L1
         do
           p_flag=1
           t_ses=echo $L1 | awk '{ print $1 }'
           if [ t_ses -eq sesID ] ;
           then
             t_uname=echo $L1 | awk '{ print $2 }'
             echo "--该进程的用户名: $t_uname"  >>kill.log
             t_kill=grep $t_uname /u1/usr/informix/no | grep -v grep | wc | awk '{ print $1 }'
             if [ t_kill -eq 0 ];
             then
               echo "----该用户: $t_uname 不在系统保护名单内"  >>kill.log
               t_pid=echo $L1 | awk '{ print $4 }'
               t_pid_no=ps -ef | grep $t_pid | grep -v grep | wc | awk '{ print $1 }'
               t_tty=echo $L1 | awk '{ print "pts/",$3 }' | tr -d ' '
               s_tty=echo $L1 | awk '{ print $3}'
               t_host=echo $L1 | awk '{ print $5 }'
               kill_time=date '+%H:%M:%S'
               cat ifx_u.tmp | awk '{print $1,$2,$3}' | grep $t_uname > shaun.tmp
               echo "------该用户: $t_uname 的系统进程列表为:"  >>kill.log
               cat ifx_u.tmp | awk '{print $1,$2,$3}' | grep $t_uname >>kill.log
               while read L2
               do
                 p_ses=echo $L2 | awk '{ print $1 }'
                 p_tty=echo $L2 | awk '{ print $3 }'
                 if [ p_ses -ne t_ses ];
                 then
                    echo "--------其他进程号: $p_ses "  >>kill.log
                    onstat -g ntt | grep sqlexec | awk '{ print $3,$4,$5,$6 }' | grep $p_ses  >>kill.log
                    if [ p_tty -eq s_tty ];then
                      echo "端口相等:p_tty:$p_tty,s_tty:$s_tty" >>kill.log 
                       preadtime=onstat -g ntt | grep sqlexec | awk '{ print $3,$4,$5,$6 }' | grep $p_ses | awk '{print$3}' | tr -d ' '
                       pwritetime=onstat -g ntt | grep sqlexec | awk '{ print $3,$4,$5,$6 }' | grep $p_ses | awk '{print$4}' | tr -d ' '
         ToSes $preadtime $pwritetime
         if [ $preadtime ];then
                            echo preadtime:$preadtime >>kill.log
                            echo pwritetime:$pwritetime >>kill.log
                          else
            echo "进程时间未取到:$p_ses" >>kill.log
            ts5=0
         fi
         echo "端口号: $p_tty ,停滞: $ts5 ,规定:$idle " >>kill.log
         if [ $ts5 -le $idle ];
                       then
                          p_flag=0
                          echo "----------正常使用,系统保留:$t_uname,T_ses:$t_ses,T_pid:$t_pid,T_tty:$t_tty"  >>kill.log
                          continue
                       fi                     
                    else
                      echo " 端口不相等:p_tty:$p_tty,s_tty:$s_tty ,本次不处理该进程 $p_ses" >>kill.log
                    fi
                 fi
               done                if [ p_flag -eq 1 ];
               then
                 t_kill=grep $t_uname /u1/usr/informix/no | grep -v grep | wc | awk '{ print $1 }'
                 if [ t_kill -eq 0 ];
                 then
            onmode -z $t_ses
            kill -9 $t_pid
            echo "----------超时用户,踢出系统:$t_uname,T_ses:$t_ses, T_pid:$t_pid,T_tty:$t_tty"  >>kill.log
          fi
        fi
      else
        echo "该用户: $t_uname 系统已作保护"  >>kill.log
             fi            #if [ t_kill -eq 0 ];
           fi              #if [ t_ses -eq sesID ] ;
        done         cnt=expr $cnt + 1
      fi
      i=0;;
  esac
done
kill_time=date '+%y/%m/%d-%H:%M:%S'
onmode -F
echo "E n d killtime:$kill_time"
echo "E n d killtime:$kill_time"  >>kill.log
rm -rf ifx_u.tmp
rm -rf shaun.tmp
rm -rf /var/spool/mail/root

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21634752/viewspace-614059/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21634752/viewspace-614059/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值