今年第31期《計算機世界》報上登載了“在Unix系統中利用程序實現kill命令”一文,文章介紹了在Unxi系統中用C語言實現kill命令的方法。筆者在實踐中找到了另外一種方法,通過Unix系統下Shell編程可以完成同樣的功能,而且使用起來更加方便、靈活、便於維護。
本程序名為kill_tty,設計思路是把需要殺死的終端名作為kill_tty命令的參數,充分運用Unix系統的管道技術與awk語句的靈活性,找出相應終端的進程號,然後將其殺死。
命令格式:kill_tty 終端設備名。
實現步驟
1. 檢驗kill_tty命令參數$1的合法性 用grep 命令檢查在 /etc/ttytype文件當中是否存在參數$1, 因為所有正在使用的終端都在/etc/ttytype文件中有相應的設備類型,如果在/etc/ttytype文件裡找不到參數$1所表示的終端號,說明$1是不合法的,終止程序運行。
grep $1 /etc/ttytype>/dev/null 2>&1
if [ $? = 1 ] ; then
echo “a終端設備類型不對!”
exit 1
fi
2. 把終端名$1作為變量,由echo命令通過管道方式交給awk語句去處理,整個處理過程實際上就是用“ps -f -t ”命令檢查出所要殺死終端的相應進程號,處理的結果通過管道方式由/bin/sh完成。
echo $1 | awk ’{ print “ps -f -t ” $0}’| /bin/sh
以終端為/dev/tty01為例,執行的結果為:
UID PID PPID C STIME TTY TIME CMD
root 323 1 0 20:07:31 tty01 00:00:00 /bin/login boot
root 360 323 2 20:07:37 tty01 00:00:00 -sh
root 404 360 14 20:09:57 tty01 00:00:00 -sh
root 410 404 3 20:09:57 tty01 00:00:00 /bin/sh
root 411 410 0 20:09:57 tty01 00:00:00 ps -f -t tty01
這裡第2列(PID)為進程標識號,終止任務需要的就是這個標識號,第8列(CMD)表示任務的程序名。
3. 有時候有些終端執行的任務可能比較多,因而與終端有關的進程比較多,我們沒有必要將與這個終端有關的正在運行的所有進程全部殺死。只需要將這個終端的sh進程殺死,就終止了這個終端的所有任務。因為在Unix系統中,sh是用戶層和核心層的接口,Unix系統就是通過它對終端上所有任務進行調度和管理的,沒有它任何一台終端上的任務都無法完成。因此,要想重新激活某個終端,只要先找出與這個終端相關的sh進程號,然後將其殺死即可達到目的。
awk ’$8~/sh/ { if ( NR == 1 ) next; print “ kill -9 ” $2}’|
/bin/sh〉/dev/null 2>&1
完整程序如下:
grep $1 /etc/ttytype>/dev/null 2>&1
if [ $? = 1 ] ; then
echo “a 終端設備類型不對!”
exit 1
fi
echo $1 | awk ’{ print “ps -f -t ”$0}’|/bin/sh|
awk ’ $8~/sh/ { if ( NR==1 ) next; print “ kill -9 ”$2}’ |
/bin/sh〉/dev/null 2>&1
小 結 所有命令通過管道技術串聯起來,把上一個命令的輸出結果作為下一個命令的輸入,最後一條命令將最終的結果輸出。和C語言所編寫的程序比較起來,一方面Unix系統中Shell編程比較簡單明了,程序本身比較短小,不像C語言那樣復雜;另一方面Shell是交互式程序,不需要編譯便可直接使用,因而比C語言更便於維護。
需要說明的是,由於在多數情況下,一般用戶沒有權限執行Unix系統的kill命令殺死不同組的一般用戶的進程,而超級用戶可以終止正在系統中運行的所有用戶的進程,因此要盡可能地在超級用戶root狀態下執行kill_tty程序.(