免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2079 | 回复: 0
打印 上一主题 下一主题

[新手入门] 自动杀超时终端、僵尸进程的shell程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-30 10:25 |只看该作者 |倒序浏览
作者:zyr2288  
### shell程序名:chk_tty
### 功能一、找出非正常退出而导致系统内出现僵尸进程,这种进程有时会不停地向CPU提出请求,导致CPU空闲率总为0;
### 功能二、找出超时登录的终端;
TTY=`tty |awk -F '/' '{print $3}'`
N=0
cat /dev/null >> chk_tty.log
while [ 1 ]
do
TIME=`date '+%Y%m%d-%H:%M:%S'`
echo $TIME
sar -u 1 2
#非正常退出检查
TTYN_A=`who |grep ttyp |awk -F ' ' '{print $2}'|sort|uniq|wc -l| \
awk -F ' ' '{print $1}'`
TTYN_B=`ps -ef|grep ttyp|grep -v tty0|grep -v tty1| \
grep -v login -c -p|awk -F ' ' '{print $6}'| \
sort|uniq|wc -l|awk -F ' ' '{print $1}'`
echo TTYN_A=$TTYN_A TTYN_B=$TTYN_B
cat /dev/null >tmp_tty.sh
if [ $TTYN_A != $TTYN_B ]
then
ps -ef | grep ttyp|awk -F ' ' '{printf sh chkttysh %s\n,$6}'| \
sort|uniq |grep -v $TTY$>tmp_tty.sh
sh tmp_tty.sh; #rm tmp_tty.sh
fi
# 超时登录检查
sleep 5
cat /dev/null >tmp_outtime.sh
who -u|grep ttyp|grep -v ^root|grep -v ^cbps| \
grep -v rewrite|grep -v ' \. '|grep :|sed s/://g| \
awk -F ' ' '{if ($6>40) printf killout %s %s 40\n,$2,$7; }' >tmp_outtime.sh
sleep 1
sh tmp_outtime.sh; #rm tmp_outtime.sh
sar -u 1 2
echo sleep 199;sleep 199
done
### shell程序名:chkttysh
### 功能:对chk_tty检出的进程判断,符合即杀出;
TY=$1
FLAG=`ps -f -t $TTY | grep login -c -p|wc -l|awk -F ' ' '{print $1}'`
if [ $FLAG -lt 1 ]
then
TODAY=`date '+%Y%m%d-'`
USER=`ps -f -t $TTY|grep ttyp|awk -F ' ' '{print $1}'`
USER_ID=`ps -f -t $TTY|grep ttyp|awk -F ' ' '{print $2}'`
USERTIME=`ps -f -t $TTY|grep ttyp|awk -F ' ' '{print $5}'|cut -b1-8`
SYSCALL=`sar -c 1 2|grep Average|awk -F ' ' '{print $2}'`
if [ x$USERTIME != $USERTIME -a $SYSCALL -gt 50000 ]
then
grep $TODAY /etc/term.log|grep $TTY|grep $USER|grep $USER_ID
STR_FLAG=`grep $TODAY chk_tty.log|grep $TTY|grep $USER|grep $USER_ID$`
echo $TODAY $USER ID=$USER_ID $USERTIME $TTY SYSCALL=$SYSCALL
if [ x$STR_FLAG = x ]
then
echo |x$STR_FLAG| |x|
grep $TODAY /etc/term.log|grep $TTY|grep $USER|grep $USER_ID >> chk_tty.log
fi
# 杀出,此功能要慎重使用,如错杀进程,会导致系统崩溃
if [ $USER_ID -gt 100 ]
then grep $TODAY /etc/term.log|grep $TTY|grep $USER|grep $USER_ID
echo kill -9 $USER_ID
kill -9 $USER_ID
fi
echo $TTY is Death processes ! Killed ! >tmp_chkttysh.txt
wrtty tmp_chkttysh.txt; sleep 1
echo  >tmp_chkttysh.txt
n=5
while [ $n -gt 0 ]
do
wrtty tmp_chkttysh.txt; sleep 1
n=`expr $n - 1`
done
fi
rm tmp_chkttysh.txt
fi
### shell程序名:killout
### 功能:杀终端
if [ $# -lt 3 ]
then echo format: killout ttyp ID OUT_M
exit
fi
TTY=$1
ID_A=$2
OUT_M=$3
TIME=`date '+%Y%m%d-%T '`
# 确保所杀进程正确,避免误杀造成系统崩溃
ID_B=`ps -f -t $TTY | grep login -c -p$ |awk -F ' ' '{print $2}'`
N_line=`ps -f -t $TTY |wc -l|awk -F ' ' '{print $1}'`
# 如果传递来的进程号与 ps 命令查到的进程号不杀出;
# 如果指定终端进程少于 3 个不杀出;
# 如果传送来的进程号是空值不杀出;
# 如果传送业的进程号小于 100 不杀出;
#if [ $ID_A != $ID_B -o $N_line -lt 3 -o x$ID_A = x -o $ID_A -lt 100 ]
if [ $ID_A != $ID_B -o $N_line -lt 3 -o x$ID_A = x ]
then
echo $TIME >>killout.err
echo ID_A=$ID_A ID_B=$ID_B N_line=$N_line >>killout.err
who -u |grep $tty >> killout.err
ps -f -t $TTY >> killout.err
sleep 1
exit
fi
echo >/dev/$TTY
echo >/dev/$TTY
echo >/dev/$TTY
echo >/dev/$TTY
echo \r 中 心 通 告 >/dev/$TTY
echo >/dev/$TTY
echo \r$TTY 用户: >/dev/$TTY
echo >/dev/$TTY
echo \r 因此终端空闲时间超过 $OUT_M 分钟,所以被强制退出,登录记录如下!!! >/dev/$TTY
echo >/dev/$TTY
echo \r 监测时间:$TIME >/dev/$TTY
echo \r
w -x |grep $TTY >/dev/$TTY
echo >/dev/$TTY
echo 要显示正在进行的操作请按 CTRL+R 进行屏幕刷新 >/dev/$TTY
echo >/dev/$TTY
echo $TIME\c >>outtime.log
w -x |grep $TTY >>outtime.log
onstat -u |grep $TTY |awk -F ' ' '{print $3}'|sed s/^/onmode -z / >tmp_sessid.sh
sh tmp_sessid.sh
kill -9 $ID_A
### shell程序名:wrtty
### 功能:与sco5.0下wall,好处是只显示自己希望显示的内容。
if [ $# -lt 3 ]
then echo format: killout ttyp ID OUT_M
exit
fi
TTY=$1
ID_A=$2
OUT_M=$3
TIME=`date '+%Y%m%d-%T '`
# 确保所杀进程正确,避免误杀造成系统崩溃
ID_B=`ps -f -t $TTY | grep login -c -p$ |awk -F ' ' '{print $2}'`
N_line=`ps -f -t $TTY |wc -l|awk -F ' ' '{print $1}'`
# 如果传递来的进程号与 ps 命令查到的进程号不杀出;
# 如果指定终端进程少于 3 个不杀出;
# 如果传送来的进程号是空值不杀出;
# 如果传送业的进程号小于 100 不杀出;
#if [ $ID_A != $ID_B -o $N_line -lt 3 -o x$ID_A = x -o $ID_A -lt 100 ]
if [ $ID_A != $ID_B -o $N_line -lt 3 -o x$ID_A = x ]
then
echo $TIME >>killout.err
echo ID_A=$ID_A ID_B=$ID_B N_line=$N_line >>killout.err
who -u |grep $tty >> killout.err
ps -f -t $TTY >> killout.err
sleep 1
exit
fi
echo >/dev/$TTY
echo >/dev/$TTY
echo >/dev/$TTY
echo >/dev/$TTY
echo \r 中 心 通 告 >/dev/$TTY
echo >/dev/$TTY
echo \r$TTY 用户: >/dev/$TTY
echo >/dev/$TTY
echo \r 因此终端空闲时间超过 $OUT_M 分钟,所以被强制退出,登录记录如下!!! >/dev/$TTY
echo >/dev/$TTY
echo \r 监测时间:$TIME >/dev/$TTY
echo \r
w -x |grep $TTY >/dev/$TTY
echo >/dev/$TTY
echo 要显示正在进行的操作请按 CTRL+R 进行屏幕刷新 >/dev/$TTY
echo >/dev/$TTY
echo $TIME\c >>outtime.log
w -x |grep $TTY >>outtime.log
onstat -u |grep $TTY |awk -F ' ' '{print $3}'|sed s/^/onmode -z / >tmp_sessid.sh
sh tmp_sessid.sh
kill -9 $ID_A


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/20073/showart_473550.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP