Linux中國

五個你可能不了解的killall選項

Linux 的 killall 命令

killall命令可以用來給一個特定的進程發送一個信號。這個信號默認情況下是SIGTERM,但也可以由killall命令使用參數來指定其它信號。

現在讓我們通過一些實際的例子來看看這個命令的實際用法。

1. 基本示例

在這個例子中,我們將使用killall來殺死特定進程。假如,有兩個開頭字元相同的進程

$ ps -aef | grep 「test」
himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
himanshu 3970 2811 0 14:14 pts/0 00:00:00 ./test_again

如何殺死「test_again」進程呢?

$ killall test_again
[2]+ Terminated ./test_again

如你所見,killall命令終止了「test_again」進程。你可以通過ps命令來確認這個事實:

$ ps -aef | grep 「test」
himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test

你可以觀察到「test_again」沒有被顯示出來,因為它已經被殺死了。

2. 使用 -I 選項忽略大小寫

默認情況下,killall命令是大小寫敏感的。例如:

$ ps -aef | grep 「test」
himanshu 4177 3161 0 14:54 pts/3 00:00:00 ./test
himanshu 4178 3161 0 14:54 pts/3 00:00:00 ./test_again
himanshu 4180 3161 0 14:54 pts/3 00:00:00 grep --color=auto test

$ killall TEST
TEST: no process found

你可以看到,killall命令找不到叫做「TEST」的進程,但是「test」進程是確確實實的在運行的。

來讓killall命令忽略大小寫,可以使用-I選項(大寫i)。例如:

$ killall -I TEST
[1]- Terminated ./test

你可以觀察到,現在你成功的終止了「test」進程。

3. 使用 -i 選項互動式的終止進程

killall命令可以用來終止多個進程。

$ killall test test_again
[2]- Terminated ./test_again
[3]+ Terminated ./test

但是,如果你想要killall互動式地來終止進程,你可以使用-i選項。

這裡是例子:

$ killall -i test test_again
Kill test(4201) ? (y/N) y
Kill test_again(4202) ? (y/N) y
[1]- Terminated ./test
[2]+ Terminated ./test_again

你可以看到,用這種方式,在同時終止多個進程時,用戶可以控制是否終止某一個進程。

4. 使用 -q 選項關閉命令執行回顯

有些時候,當killall找不到指定的進程時,它就會像下面這樣輸出錯誤信息。

$ killall TEST
TEST: no process found

但是,當你想要killall執行地安安靜靜的話,你就可以使用-q選項:

$ killall -q TEST
$

如你所見,-q選項被使用之後,killall命令的輸出信息就被抑制了。

5. 使用-l選項列出所有支持的信號(signal)

如之前描述的一樣,killall向進程發送信號。

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

想要知道所有可以發送的信號,可以使用-l選項(小寫L)來獲取:

$ killall -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

killall支持上面的所有信號。

看著這些信號的名字,可能你心裡就會嘀咕:這些信號都是幹什麼的?

譯者註:使用下面的命令來獲取所有信號的說明:

$ man 7 signal

我需要和大家討論一件事情

killall命令的man說:假如進程的名字的長度小於等於15,默認情況下就會以完整名稱匹配。

比如,假設有兩個名字很長的進程:

$ ps -aef | grep 「test」
himanshu 4021 3161 0 14:27 pts/3 00:00:00 ./test_abcdefghij
himanshu 4035 3161 0 14:27 pts/3 00:00:00 ./test_abcdefgh

第一個進程的名字有15個字元。現在,讓我們試著使用killall殺死這個進程:

$ killall test_abcdefghij
[1]- Terminated ./test_abcdefghij

如你所見,killall命令成功殺死了這個進程。

假如,兩個進程的名字都超過15個字元,根據man,killall將把兩個進程全部殺死。比如:

$ ps -aef | grep 「test」
himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
himanshu 4141 3161 0 14:46 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwxyz
himanshu 4143 3161 0 14:46 pts/3 00:00:00 grep --color=auto test

你可以觀察到,兩個進程的名字都超過15個字元。現在,當我使用killall試著殺死第二個進程時:

$ killall test_abcdefghijklmnopqrstuvwxyz
[6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz

它只殺死了指定的進程,另一個則沒有被殺死。

$ ps -aef | grep 「test」
himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
himanshu 4146 3161 0 14:47 pts/3 00:00:00 grep --color=auto test

我不太確定,是我進行的嘗試中有不對的地方,還是這是killall的一個bug。假如你在評論中寫上你的觀點,我會非常感激。

順便說一下,這是我機器上killall命令的版本信息:

$ killall --version
killall (PSmisc) 22.20
Copyright (C) 1993-2012 Werner Almesberger and Craig Small

PSmisc comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under
the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.

via: http://linoxide.com/linux-command/linux-killall-my-options/

譯者:intermerlin 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國