在一臺100多人使用的 SUN 服務器上常常發現有人濫用資源,平時用用就算了,到了交做業的時候100多號人同時登陸使用,服務器明顯遲緩,特別是實驗室用的是瘦客戶機,沒硬盤,SUN 客戶端須要從服務器裝載系統鏡像,並且編譯、運行程序都要在服務器上完成。若是發現某個用戶運行不少進程,而且進程還有子進程,怎麼能方便的找出所有進程 並 kill 掉呢? mysql
ps -ef | grep ^username | cut -c 10-15 | xargs kill -9 程序員
把所有進程打印出來根據用戶名過濾後找出所有進程號,而後逐行 kill 掉。xargs 就是用來把 cut 後的輸出逐個以空白符分割後輸給 kill。注意上面的 grep ^username 不能缺 ^,^username 表示從一行開始匹配 username,好比就能夠避免匹配到 sshd: username@pts/0。不過儘管加了 ^,上面的代碼仍然有個小 bug,若是剛好有個進程名和用戶名徹底同樣怎麼辦?能夠用 ps -u 找出全部與 username 相關的進程,而後 grep -v 過濾掉 PID 只剩下進程信息,而後逐行 kill 掉,以下: sql
ps -u username | grep -v PID | cut -c 0-5 | xargs kill -9 數據庫
不過上面的命令還有個小問題就是若是 cut 的時候不當心 cut 多了或者 cut 少了怎麼辦?能夠用 awk 過濾一列信息出來: 服務器
ps -u username | grep -v PID | awk '{print$1}'| xargs kill -9
上面的命令也能夠在 Linux 上運行,不過在 Linux 下能夠用更簡單的 killall,Solaris 上沒有 killall: ssh
killall -u username
一個小小的命令行反反覆覆改了屢次,更別說上百萬行的代碼了,寫代碼太容易引入 bug 了,這就是爲何測試這麼重要的緣由,我以爲程序員應該用50%的時間寫代碼,50%的時間測代碼;測試員也應該用50%的時間測代碼,50%的時間寫工具來自動測試代碼。 工具
終止一個進程或終止一個正在運行的程序,通常是經過kill 、killall、pkill、xkill 等進行。好比一個程序已經死掉,但又不能退出,這時就應該考慮應用這些工具。 測試
應用的場合就是在服務器管理中,在不涉及數據庫服務器程序的父進程的中止運行,也能夠用這些工具來終止。爲何數據庫服務器的父進程不能用這些工具殺死呢?緣由很簡單,這些工具在強行終止數據庫服務器時,會讓數據庫產生更多的文件碎片,當碎片達到必定程度的時候,數據庫就有崩潰的危險。好比mysql 服務器最好是按其正常的程序關閉,而不是用pkill mysqld 或killall mysqld 這樣危險的動做;固然對於佔用資源過多的數據庫子進程,咱們應該用kill 來殺掉。
kill [信號代碼] 進程ID
注:信號代碼能夠省略;咱們經常使用的信號代碼是-9 ,表示強制終止; spa
對於殭屍進程,能夠用kill -9 來強制終止退出;
好比一個程序已經完全死掉,若是kill 不加信號強度是沒有辦法退出,最好的辦法就是加信號強度-9 命令行
killall 經過程序的名字,直接殺死全部進程
pkill 和killall 應用方法差很少,也是直接殺死運行中的程序;若是您想殺掉單個進程,請用kill 來殺掉。