藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 系統管理


    

藍森林 http://www.lslnet.com 2006年8月08日 13:08


如果判斷僵死終端進程???????

有多台終端登到前置機上做業務,不時的有終端會死掉,要人手工去殺,麻煩~~!
我想問一下,能不能通過PS或其他命令可以發現有終端死了呢?

先謝

如果判斷僵死終端進程???????

用ps可以發現殭屍進程,一般殭屍進程會被標記為<defunct>;

如果判斷僵死終端進程???????

作者: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

如果判斷僵死終端進程???????

可否解釋一下哦

如果判斷僵死終端進程???????

真是好東西,我來試一下,結果告訴大家

如果判斷僵死終端進程???????

哪位給貼出來的呀?我都不記得了。

上面殺殭屍原理是:根據who檢查到的tty和ps命令查到的tty作比較,並濾掉一些正常的tty(如在終端上出現login但未登錄進系統時,系統內會分配tty並存但進程,但這是個正常進程,不是殭屍),然後殺之。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com