五個(gè)你可能不了解的Killall命令的實(shí)際應(yīng)用
Linux的命令行提供很多命令來殺死進(jìn)程。比如,你可以向“kill”命傳遞一個(gè)PID來殺死進(jìn)程;“pkill”命令使用一個(gè)正則表達(dá)式作為輸入,所以和該模式匹配的進(jìn)程都被殺死。
但是還有一個(gè)命令叫“killall”,默認(rèn)情況下,它精確地匹配參數(shù)名,然后殺死匹配進(jìn)程。在這篇文章中,我們將討論有關(guān)這個(gè)命令的實(shí)際應(yīng)用。
Linux 的 killall 命令
Killall命令可以用來給一個(gè)特定的進(jìn)程發(fā)送一個(gè)信號。這個(gè)信號默認(rèn)情況下是SIGTERM,但也可以由killall命令使用參數(shù)來指定其它信號。
現(xiàn)在讓我們通過一些實(shí)際的例子來看看這個(gè)命令的實(shí)際用法。
1. 基本示例
在這個(gè)例子中,我們將使用killall來殺死特定進(jìn)程。假如,有兩個(gè)開頭字符相同的進(jìn)程:
- $ 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”進(jìn)程呢?
- $ killall test_again
- [2]+ Terminated ./test_again
如你所見,killall命令終止了“test_again”進(jìn)程。你可以通過ps命令來確認(rèn)這個(gè)事實(shí):
- $ ps -aef | grep “test”
- himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
你可以觀察到“test_again”沒有被顯示出來,因?yàn)樗呀?jīng)被殺死了。
2. 使用 -I 選項(xiàng)忽略大小寫
默認(rèn)情況下,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”的進(jìn)程,但是“test”進(jìn)程是確確實(shí)實(shí)的在運(yùn)行的。
來讓killall命令忽略大小寫,可以使用-I選項(xiàng)(大寫i)。例如:
- $ killall -I TEST
- [1]- Terminated ./test
你可以觀察到,現(xiàn)在你成功的終止了“test”進(jìn)程。
3. 使用 -i 選項(xiàng)交互式的終止進(jìn)程
killall命令可以用來終止多個(gè)進(jìn)程。
- $ killall test test_again
- [2]- Terminated ./test_again
- [3]+ Terminated ./test
但是,如果你想要killall交互式地來終止進(jìn)程,你可以使用-i選項(xiàng)。
這里是例子:
- $ 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
你可以看到,用這種方式,在同時(shí)終止多個(gè)進(jìn)程時(shí),用戶可以控制是否終止某一個(gè)進(jìn)程。
4. 使用 -q 選項(xiàng)關(guān)閉命令執(zhí)行回顯
有些時(shí)候,當(dāng)killall找不到指定的進(jìn)程時(shí),它就會(huì)像下面這樣輸出錯(cuò)誤信息。
- $ killall TEST
- TEST: no process found
但是,當(dāng)你想要killall執(zhí)行地安安靜靜的話,你就可以使用-q選項(xiàng):
- $ killall -q TEST
- $
如你所見,-q選項(xiàng)被使用之后,killall命令的輸出信息就被抑制了。
5. 使用-l選項(xiàng)列出所有支持的信號(signal)
如之前描述的一樣,killall向進(jìn)程發(fā)送信號。
你可以使用-s選項(xiàng)(后面跟一個(gè)信號名)來向一個(gè)進(jìn)程發(fā)送特殊信號。
想要知道所有可以發(fā)送的信號,可以使用-l選項(xiàng)(小寫L)來獲?。?/p>
- $ 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支持上面的所有信號。
看著這些信號的名字,可能你心里就會(huì)嘀咕:這些信號都是干什么的?
譯者注:使用下面的命令來獲取所有信號的說明:
- $ man 7 signal
我需要和大家討論一件事情
killall命令的man說:假如進(jìn)程的名字的長度小于等于15,默認(rèn)情況下就會(huì)以完整名稱匹配。
比如,假設(shè)有兩個(gè)名字很長的進(jìn)程:
- $ 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
第一個(gè)進(jìn)程的名字有15個(gè)字符。現(xiàn)在,讓我們試著使用killall殺死這個(gè)進(jìn)程:
- $ killall test_abcdefghij
- [1]- Terminated ./test_abcdefghij
如你所見,killall命令成功殺死了這個(gè)進(jìn)程。
假如,兩個(gè)進(jìn)程的名字都超過15個(gè)字符,根據(jù)man,killall將把兩個(gè)進(jìn)程全部殺死。比如:
- $ 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
你可以觀察到,兩個(gè)進(jìn)程的名字都超過15個(gè)字符?,F(xiàn)在,當(dāng)我使用killall試著殺死第二個(gè)進(jìn)程時(shí):
- $ killall test_abcdefghijklmnopqrstuvwxyz
- [6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz
它只殺死了指定的進(jìn)程,另一個(gè)則沒有被殺死。
- $ 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
我不太確定,是我進(jìn)行的嘗試中有不對的地方,還是這是killall的一個(gè)bug。假如你在評論中寫上你的觀點(diǎn),我會(huì)非常感激。
順便說一下,這是我機(jī)器上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