.

Linux 的命令列提供很多命令來殺死程序。比如,你可以向 kill 命傳遞一個PID來殺死程序;pkill 命令使用一個正則表示式作為輸入,所以和該模式匹配的程序都被殺死。

但是還有一個命令叫 killall ,預設情況下,它精確地匹配引數名,然後殺死匹配程序。在這篇文章中,我們將討論有關這個命令的實際應用。

預設情況下,killall 命令將向一個/組程序傳送一個 SIGTERM 訊號,但是,也可以通過引數傳送一個指定的訊號。

下面我們通過例子詳細介紹 killall 的 8 大用法。

1、基本用法

假如我們 3 個程序在執行,分別是 hello1, hello2, hello3 ,現在我們想殺死 hello1 程序,可以直接使用如下方式:

  1. killall hello1 

執行的結果如下:

  1. [[email protected]_0_16_centos test]$ ps aux | grep hello  
  2. alvin    12061  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello1  
  3. alvin    12074  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello2  
  4. alvin    12084  0.0  0.0   4152   340 pts/0    S    14:41   0:00 ./hello3  
  5. alvin    12089  0.0  0.0 112648   964 pts/0    R+   14:41   0:00 grep --color=auto hello  
  6. [[email protected]_0_16_centos test]$ killall hello1  
  7. [1]   Terminated              ./hello1  
  8. [[email protected]_0_16_centos test]$ ps aux | grep hello  
  9. alvin    12074  0.0  0.0   4152   344 pts/0    S    14:41   0:00 ./hello2  
  10. alvin    12084  0.0  0.0   4152   340 pts/0    S    14:41   0:00 ./hello3  
  11. alvin    12170  0.0  0.0 112648   964 pts/0    R+   14:42   0:00 grep --color=auto hello 

可以看到,hello1 程序已經被殺死了。

剩下的 hello2 和 hello3 程序,我們想一次性殺死他們,也就是批量殺死程序,可以如下操作:

  1. [[email protected]_0_16_centos test]$ killall hello*  
  2. hello: no process found  
  3. hello1: no process found  
  4. hello.c: no process found  
  5. [2]-  Terminated              ./hello2  
  6. [3]+  Terminated              ./hello3 

如此,以 hello 開頭的程序全部被幹掉。

2、終止某個使用者所執行的程序

我們可以殺死以滿足某個正則表示式的一組程序,同樣的,我們也可以殺死某個使用者執行的所有程序。

比如,使用者 harry 現在執行如下幾個程序:

  1. [[email protected]_0_16_centos test]$ ps aux | grep harry  
  2. root     13675  0.0  0.2 148236  5584 ?        Ss   14:55   0:00 sshd: harry [priv]  
  3. harry    13677  0.0  0.1 148236  2944 ?        S    14:55   0:00 sshd: [email protected]/1  
  4. root     13678  0.0  0.2 148236  5444 ?        Ss   14:55   0:00 sshd: harry [priv]  
  5. harry    13680  0.0  0.1 148236  2252 ?        S    14:55   0:00 sshd: [email protected]  
  6. harry    13681  0.0  0.1  53228  2168 ?        Ss   14:55   0:00 /usr/libexec/openssh/sftp-server  
  7. harry    13694  0.0  0.1 116436  3252 pts/1    Ss+  14:55   0:00 -bash  
  8. harry    13948  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello1  
  9. harry    13952  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello2  
  10. harry    13959  0.0  0.0   4152   344 pts/1    S    14:57   0:00 ./hello3  
  11. alvin    14005  0.0  0.0 112648   964 pts/0    R+   14:58   0:00 grep --color=auto harry 

我們現在想殺死 harry 所執行的所有程序,可以以如下方式操作:

  1. killall -u harry 

執行結果如下:

  1. [[email protected]_0_16_centos test]$ sudo killall -u harry  
  2. [[email protected]_0_16_centos test]$ ps aux | grep harry  
  3. alvin    14040  0.0  0.0 112648   964 pts/0    R+   14:58   0:00 grep --color=auto harry 

但是,這個選項要慎用,因為它會把該使用者所有程序,包括終端程序,全部殺死,將導致該使用者直接退出。所以,如果不想捱揍的話不要輕意嘗試這個選項。

3、終於時間的方式終止程序

假如我們現在運行了很多程式,我們只想殺死執行時間超過 5h 的程序,那麼可以使用 -o 選項,其中 o 代表 older 如下:

  1. killall -o 5h 

同樣地,如果你想殺死進行時間小於 4h 的程序,那麼可以使用 -y 選項,其中 y 代表 younger ,如下:

  1. killall -y 4h 

這兩個選項同樣非常粗暴,也會把終端退出,所以先不演示了。

4、忽略大小寫

預設情況下,killall 命令是大小寫敏感的,所以我們如果寫錯大小寫,將無法正確殺死程序。

  1. [[email protected]_0_16_centos test]$ killall HELLO1  
  2. TEST1: no process found 

如果我們想忽略大小寫,可以加上 -I (大寫字母 i )選項。

  1. [[email protected]_0_16_centos test]$ killall -I HELLO1  
  2. [1]   Terminated              ./hello1 

5、關閉命令執行回顯

預設情況下,killall 會告訴你命令執行情況,但是,我們如果不關心它的執行結果,只想讓它靜默執行,該怎麼辦?只需加上 -q 選項即可,其中 q 表示 quite , 如下:

  1. [[email protected]_0_16_centos test]$ killall HELLO2  
  2. HELLO2: no process found  
  3. [[email protected]_0_16_centos test]$ killall -q HELLO2  
  4. [[email protected]_0_16_centos test]$ 

6、列出所有支援的訊號

如前文所述,預設情況下,killall 命令將傳送 SIGTERM 訊號,那麼,安可以傳送其它訊號嗎?當然是可以的。可以使用 -l 選項檢視 killall 所支援的所有訊號:

  1. [[email protected]_0_16_centos test]$ killall -l  
  2. HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM  
  3. STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS  
  4. UNUSED 

你可以使用 -s 選項(後面跟一個訊號名)來向一個程序傳送特殊訊號。

7、互動式操作

如果你在殺死多個程序時不太放心,擔心把不該殺死的程序給殺死了,那麼你可以使用 -i 選項,這樣就可以自由決定哪些程序應該被殺死,哪些程序應該被保留。

  1. [[email protected]_0_16_centos test]$ killall -i hello*  
  2. Kill hello2(13825) ? (y/N) y  
  3. Kill hello3(13831) ? (y/N) N  
  4. hello: no process found  
  5. hello1: no process found  
  6. hello3: no process found  
  7. hello.c: no process found  
  8. [2]-  Terminated              ./hello2 

8、等待直到某個程序被終止

當一個訊號被髮送至某個程序,如果你想確定該程序已經被殺死了才返回執行結果,可以使用 -w 選項,其中 w 代表 wait ,如下:

  1. [[email protected]_0_16_centos test]$ killall -w hello1  
  2. [4]+  Terminated              ./hello1 

這裡好像看不出什麼效果,但實際執行的時候,可以發現執行結果會在一兩秒後出現,而不加 -w 選項的話,執行結果馬上就顯示。

覺得不錯請點贊支援,歡迎留言或進我的個人群855801563領取【架構資料專題目合集90期】、【BATJTMD大廠JAVA面試真題1000+】,本群專用於學習交流技術、分享面試機會,拒絕廣告,我也會在群內不定