歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> 也談在Unix系統中殺死相關終端的進程

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

日期:2017/2/25 10:13:07   编辑: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