五個你可能不了解的Killall命令的實際應用
Linux的命令行提供很多命令來殺死進程。比如,你可以向“kill”命傳遞一個PID來殺死進程;“pkill”命令使用一個正則表達式作為輸入,所以和該模式匹配的進程都被殺死。
但是還有一個命令叫“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個字符?,F在,當我使用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