该脚本可以清除指定的终端所有进程,即强行登出该终端.一般该脚本由root用户操作,但如果给予普通用户kill命令的系统授权,普通用户也能运行
成功运行该脚本.
[code]#!/bin/ksh
#清除指定终端所有进程的shell V050721
#改进为支持命令行多参数,即可一次性kill多个指定的tty进程 V070521
#改进多tty时显示排列问题 V050825
#修正普通用户使用时的BUG及改进界面 V050926
echotty()
{
echo
n=0
for i in `echo $*`
do
((n=n+1))
test $((n%6)) -eq 0 && printf "\n\n%5s"$i || printf "%5s"$i
done
}
trap "rm $HOME/kill_pid $HOME/killpid 2>/dev/null tput sgr0 echo exit 0" 0 1 2 3 9 15
clear
tput bold
if [ "$1" = '-h' ]
then
tput cup 5 10
echo " 清除指定终端所有进程的shell V050628\n "
echo "***本shell由乐山市沙湾区邮政局宋涛调试成功,感谢使用 ^_^ ***"
echo
echo
echo "调用格式: "`basename $0` "[ -h ] [ 终端号 ]"
echo " -h: 帮助"
echo " 终端号: 欲清除死进程的终端号\n"
echo " 例: `basename $0` ttyp1 #杀死终端ttyp1所有进程\n "
echo "此时一般用此shell清除该终端所有进程后终端可恢复正常登陆;"
echo '若还是不能登陆,可由root做 >/dev/死锁终端 (此时终端必须'
echo "是开机状态),还是不行时请重启服务器\n"
exit 0
fi
if [ $# -eq 0 ]
then
echo "\n────────────── 清除指定终端进程─────────────"
test $(logname) = "root" && { ttyname=$(who | awk '{printf("\n%20s\n",$2)}') user="root" } \
|| { ttyname=$(who | grep $(logname) | awk '{printf("\n%20s\n",$2)}') user="user" }
echotty $ttyname
echo "\n\n ───────────────────────────────────"
echo "\n请输入要杀死进程的终端: \c"
read zdh
test "$zdh" = "q" && exit 0
else
test `logname` = "root" && user="root" || user="user"
zdh=$*
fi
for kt in $zdh
do
if [ "$user" = "root" ]
then
ps -t $kt|awk '{print "kill -9 " $1}' > $HOME/kill_pid
sed -e ' s/kill -9 PID/ /g' < $HOME/kill_pid > $HOME/killpid
else
ps -t $kt|awk '{print "/tcb/bin/asroot kill -9 " $1}' > $HOME/kill_pid
sed -e ' s/\/tcb\/bin\/asroot kill -9 PID/ /g' < $HOME/kill_pid > $HOME/killpid
fi
sort -d -r $HOME/killpid > $HOME/kill_pid
sh $HOME/kill_pid >/dev/null 2>/dev/null
end=$?
test -e /etc/fuser -o -x /etc/fuser && fuser /dev/$kt >/dev/null 2>/dev/null
test $end -eq 0 && echo "\n 清除 ${kt} 进程成功\n" || \
echo "\n 清除 ${kt} 进程失败\n"
done[/code]
|
|
|