歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

也談在Unix系統中殺死相關終端的進程

  今年第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程序.(




Copyright © Linux教程網 All Rights Reserved