kill 和 pgrep 和 pidof 和 awk 和 pkill 和 killall
?
Mastering the “Kill” Command in Linux:https://www.maketecheasier.com/kill-command-in-linux
?
?
無論你使用哪種操作系統,你一定會遇到某個行為失常的應用,它把自己鎖死并拒絕關閉。在Linux(還有Mac),你可以用一個"kill"命令強制終結它。在這個教程中,我們將展示給你多種方式使用"kill"命令終結應用。
?
Kill命令和信號
當你執行一個"kill"命令,你實際上發送了一個信號給系統,讓它去終結不正常的應用。總共有60個你可以使用的信號,但是基本上你只需要知道SIGTERM(15)和SIGKILL(9)。
你可以用這個命令看到所有信號的列表:kill?-l?
- SIGTERM :?此信號請求一個進程停止運行。此信號是可以被忽略的。進程可以用一段時間來正常關閉,一個程序的正常關閉一般需要一段時間來保存進度并釋放資源。換句話說,它不是強制停止。
- SIGKILL :?此信號強制進程立刻停止運行。程序不能忽略此信號,而未保存的進度將會丟失。
使用"kill"的語法是:kill?[信號或選項]?PID(s)?
默認信號(當沒有指定的時候)是SIGTERM。當它不起作用時,你可以使用下面的命令來強制kill掉一個進程:
? ? ? ? kill?SIGKILL?PID?
或者:
? ? ? ? kill?-9?PID?
這里"-9"代表著SIGKILL信號。
如果你不知道應用的PID,僅需要運行這個命令:ps ux??或者 ps -aux 或者 ps -ef?
它會顯示所有正在運行的應用還有應用的PID。
例如,要 kill 掉 Chrome,我會運行命令:kill?-9?3629?
也可以在同一時間? kill 多個進程:kill?-9?PID1?PID2?PID3?
?
PKill
"pkill" 命令是 “按名字” 殺掉進程。允許使用擴展的正則表達式和其它匹配方式。你現在可以使用應用的進程名kill掉它們,而不是使用PID。例如,要 kill 掉 Firefox 瀏覽器,只需要運行命令:pkill?firefox?
使用正則表達式匹配的話,你可以輸入進程名的部分字符,比如:pkill?fire?
為了避免 kill 掉錯誤的進程,你應該用一下 "?pgrep -l [進程名]?" 列表來匹配進程名稱。
?
Killall
killall 同樣使用 進程名 替代 PID,并且它會 kill 掉所有的同名進程。例如,如果你正在運行多個Firefox瀏覽器的實例,可以用命令把它們全部 kill 掉:( killall 和 pkill 是相似的,不過如果給出的進程名不完整,killall 會報錯。pkill 不需要完整的進程名就行)
結束 firefox 進程:killall firefox
在Gnome中,你可以使用這個命令重啟 Nautilus:killall?nautilus?
?
xkill
xkill 是圖形方式kill一個應用。當你在終端鍵入"xkill",你的光標將立刻變成一個"十字"。你只需要做的是在不正常的應用上點擊一下,它就會立刻kill掉這個應用。如果你經常用的話,你也可以添加一個鍵盤快捷鍵來激活xkill。
?
?
結論
當應用不正常而導致系統掛起的時候,人們往往重啟計算機并且再一次開啟所有的任務。而有了這些"kill"命令,你將能夠更好的處理不正常的應用,從而避免導致系統崩潰。當你不想因一個不正常的進程而導致服務器宕機時,它尤其的有用。
?
?
?
實例?
?
實例1:列出所有信號名稱 kill -l 只有第9種信號(SIGKILL)才可以無條件終止進程,其他信號進程都有權利忽略。 下面是常用的信號: HUP 1 終端斷線 INT 2 中斷(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) TERM 15 終止 KILL 9 強制終止 CONT 18 繼續(與STOP相反, fg/bg命令) STOP 19 暫停(同 Ctrl + Z)實例2:得到指定信號的數值 [root@localhost test6]# kill -l KILL [root@localhost test6]# kill -l SIGKILL [root@localhost test6]# kill -l TERM [root@localhost test6]# kill -l SIGTERM [root@localhost test6]#實例3:先用ps查找進程,然后用kill殺掉 [root@localhost test6]# ps -ef | grep vim root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log root 3370 2822 0 16:21 pts/0 00:00:00 grep vim [root@localhost test6]# kill 3268 [root@localhost test6]# kill 3268 實例4:徹底殺死進程 [root@localhost test6]# ps -ef | grep vim root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log root 3370 2822 0 16:21 pts/0 00:00:00 grep vim [root@localhost test6]# kill –9 3268 [root@localhost test6]# kill 3268 實例5:殺死指定用戶所有進程 [root@localhost ~]# kill -9 $(ps -ef | grep peidalinux) [root@localhost ~]# kill -u peidalinux實例6:init進程是不可殺的 [root@localhost ~]# ps -ef | grep init root 1 0 0 Nov02 ? 00:00:00 init [3] root 17563 17534 0 17:37 pts/1 00:00:00 grep init [root@localhost ~]# kill -9 1 [root@localhost ~]# kill -HUP 1 [root@localhost ~]# ps -ef | grep init root 1 0 0 Nov02 ? 00:00:00 init [3] root 17565 17534 0 17:38 pts/1 00:00:00 grep init [root@localhost ~]# kill -KILL 1 [root@localhost ~]# ps -ef|grep init root 1 0 0 Nov02 ? 00:00:00 init [3] root 17567 17534 0 17:38 pts/1 00:00:00 grep init [root@localhost ~]#ps -ef 或者 ps aux // 查看進程的方法: kill -s 9 15572 或者 kill -9 15572 -s 9 指定傳遞給進程的信號是9即強制終止進程。假設15572用ps查到的火狐(firefox)的PID。kill -9, 這個強大和危險的命令迫使進程在運行時突然終止,進程在結束后不能自我清理。危害是導致系統資源無法正常釋放,一般不推薦使用,除非其他辦法都無效。 當使用此命令時,一定要通過ps -ef確認沒有剩下任何僵尸進程。只能通過終止父進程來消除僵尸進程。如果僵尸進程被init收養,問題就比較嚴重了。殺死init進程意味著關閉系統。 如果系統中有僵尸進程,并且其父進程是init,而且僵尸進程占用了大量的系統資源,那么就需要在某個時候重啟機器以清除進程表了。 進階篇:改進 1 —— grep 把ps的查詢結果通過管道傳給grep,查找包含特定字符串的進程。 管道符“|”用來隔開兩個命令,管道符左邊命令的輸出會作為管道符右邊命令的輸入。 例如: homer@ubuntu:~$ ps -aux | grep firefox 直接找到firefox進程PID, 輸入: kill -s 9 15572改進 2 —— pgrep pgrep的p表明了這個命令是專門用于進程查詢的grep 例如: homer@ubuntu:~$ pgrep firefox改進 3 —— pidof pidof命令,表示 pid of xx,字面翻譯過來就是 xx的PID。和pgrep相比稍顯不足的是,pidof必須給出進程的全名。 例如: homer@ubuntu:~$ pidof firefox改進 4 —— kill + xargs $ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9 說明: “grep firefox”的輸出結果是,所有含有關鍵字“firefox”的進程。 “grep -v grep”是在列出的進程中去除含有關鍵字“grep”的進程。 “cut -c 9-15”是截取輸入行的第9個字符到第15個字符,而這正好是進程號PID。 “xargs kill -s 9”中的xargs命令是用來把前面命令的輸出結果(PID)作為“kill -s 9”命令的參數,并執行該命令。“kill -s 9”會強行殺掉指定進程。殺死進程的方式有以下幾種: a) ps -ef | grep firefox | grep -v grep | awk '{print $2}' | xargs kill -s 9 b) pgrep firefox | xargs kill -s 9 c) pidof firefox | xargs kill -s 9 或 d) kill -s 9 `ps -ef | grep firefox | grep -v grep | awk '{print $2}'` e) kill -s 9 `pgrep firefox` f) kill -s 9 `pidof firefox`改進 5 知道pgrep和pidof兩個命令,干嘛還要打那么長一串! $ pgrep firefox | xargs kill -s 9改進6 —— grep + awk $ ps -ef | grep firefox | grep -v grep | awk '{print $2}' | xargs kill -9 其中awk '{print $2}' 的作用就是打印(print)出第二列的內容。 ps輸出的第二列正好是PID。就把進程相應的PID通過xargs傳遞給kill作參數,殺掉對應的進程。改進7: 難道每次都要調用xargs把PID傳遞給kill?答案是否定的: $kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`改進8: 沒錯,命令依然有點長,換成pgrep。 $kill -s 9 `pgrep firefox`改進9——pkill: pkill 類似于 pgrep, pkill 表示 pgrep+kill。即 pkill=pgrep+kill。 $pkill -9 firefox // 或者 pkill firefox 說明:"-9" 即發送的信號是9,pkill與kill在這點的差別是:pkill無須 “s”,終止信號等級直接跟在 “-“ 后面。改進10——killall: killall命令, 殺死同一進程組內的所有進程,其允許指定要終止的進程的名稱,而非PID。 killall和pkill是相似的,不過如果給出的進程名不完整,killall會報錯。 pkill或者pgrep只要給出進程名的一部分就可以終止進程。 $killall firefo firefo: no process found $killall firefox $killall -9 firefoxkill 殺死進程最安全的方法是單純使用kill命令,不加修飾符,不帶標志。 例如: # kill -pid 注釋: 標準的kill命令,默認采用信號(signal)號是15,通常都能達到目的,終止有問題的進程,并把進程的資源釋放給系統。然而,如果進程啟動了子進程,只殺死父進程,子進程仍在運行,因此仍消耗資源。為了防止這些所謂的“僵尸進程”,應確保在殺死父進程之前,先殺死其所有的子進程。 kill -l 例如: kill -l PID -l 選項, 告訴kill命令用好像啟動進程的用戶已注銷的方式結束進程。 當使用該選項時,kill命令也試圖殺死所留下的子進程。但這個命令也不是總能成功--或許仍然需要先手工殺死子進程,然后再殺死父進程。 kill -HUP 有時候只想簡單的停止和重啟進程。 例如: # kill -HUP PID 該命令讓Linux和緩的執行進程關閉,然后立即重啟。 在配置應用程序的時候,這個命令很方便,在對配置文件修改后需要重啟進程時就可以執行此命令。?
踢掉登錄用戶和用戶進程
linux系統root用戶可強制踢制其它登錄用戶 首先可用$w命令查看登錄用戶信息,顯示信息如下: [root@Wang ~]# w 10:01:23 up 1:23, 3 users, load average: 0.71, 0.58, 0.57 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 - 09:59 1:53 0.01s 0.01s -bash root pts/0 :0.0 10:01 0.00s 0.03s 0.00s w wangbo pts/2 192.168.0.196 09:42 18:50 0.01s 0.01s -bash [root@Wang ~]#pkill -kill -t pts/1[root@Wang ~]# ps -ef | grep pts/0 root 15846 15842 0 10:04 pts/0 00:00:00 bash root 15876 15846 0 10:06 pts/0 00:00:00 ps -ef root 15877 15846 0 10:06 pts/0 00:00:00 grep pts/0 踢掉用戶的命令: kill -9 15846結束掉某個用戶的所有進程。初學者一般會先查詢出用戶的所有pid,然后一條條kill結束掉,或者寫一個腳本。 實際上結束的方法有很多,這邊總結了下面4種方法,以kill用戶zhangnq為例。 1. pkill方式 # pkill -u zhangnq 2. killall方式 # killall -u zhangnq 3. ps方式 ps列出zhangnq的pid,然后依次kill掉,比較繁瑣。 # ps -ef | grep zhangnq | awk '{ print $2 }' | xargs kill -9 4. pgrep方式 pgrep -u參數查出用戶的所有pid,然后依次kill # pgrep -u zhangnq | xargs kill -9?
?
總結
以上是生活随笔為你收集整理的kill 和 pgrep 和 pidof 和 awk 和 pkill 和 killall的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python进阶之“属性(propert
- 下一篇: Lambda 表达式详解~Stream