Linux下使用killall命令終止進(jìn)程的8大用法
Linux 的命令行提供很多命令來(lái)殺死進(jìn)程。比如,你可以向 kill 命傳遞一個(gè)PID來(lái)殺死進(jìn)程;pkill 命令使用一個(gè)正則表達(dá)式作為輸入,所以和該模式匹配的進(jìn)程都被殺死。
但是還有一個(gè)命令叫 killall ,默認(rèn)情況下,它精確地匹配參數(shù)名,然后殺死匹配進(jìn)程。在這篇文章中,我們將討論有關(guān)這個(gè)命令的實(shí)際應(yīng)用。
默認(rèn)情況下,killall 命令將向一個(gè)/組進(jìn)程發(fā)送一個(gè) SIGTERM 信號(hào),但是,也可以通過(guò)參數(shù)發(fā)送一個(gè)指定的信號(hào)。
下面我們通過(guò)例子詳細(xì)介紹 killall 的 8 大用法。
1、基本用法
假如我們 3 個(gè)進(jìn)程在運(yùn)行,分別是 hello1, hello2, hello3 ,現(xiàn)在我們想殺死 hello1 進(jìn)程,可以直接使用如下方式:
- killall hello1
運(yùn)行的結(jié)果如下:
- [alvin@VM_0_16_centos test]$ ps aux | grep hello
- alvin 12061 0.0 0.0 4152 344 pts/0 S 14:41 0:00 ./hello1
- alvin 12074 0.0 0.0 4152 344 pts/0 S 14:41 0:00 ./hello2
- alvin 12084 0.0 0.0 4152 340 pts/0 S 14:41 0:00 ./hello3
- alvin 12089 0.0 0.0 112648 964 pts/0 R+ 14:41 0:00 grep --color=auto hello
- [alvin@VM_0_16_centos test]$ killall hello1
- [1] Terminated ./hello1
- [alvin@VM_0_16_centos test]$ ps aux | grep hello
- alvin 12074 0.0 0.0 4152 344 pts/0 S 14:41 0:00 ./hello2
- alvin 12084 0.0 0.0 4152 340 pts/0 S 14:41 0:00 ./hello3
- alvin 12170 0.0 0.0 112648 964 pts/0 R+ 14:42 0:00 grep --color=auto hello
可以看到,hello1 進(jìn)程已經(jīng)被殺死了。
剩下的 hello2 和 hello3 進(jìn)程,我們想一次性殺死他們,也就是批量殺死進(jìn)程,可以如下操作:
- [alvin@VM_0_16_centos test]$ killall hello*
- hello: no process found
- hello1: no process found
- hello.c: no process found
- [2]- Terminated ./hello2
- [3]+ Terminated ./hello3
如此,以 hello 開(kāi)頭的進(jìn)程全部被干掉。
2、終止某個(gè)用戶所運(yùn)行的進(jìn)程
我們可以殺死以滿足某個(gè)正則表達(dá)式的一組進(jìn)程,同樣的,我們也可以殺死某個(gè)用戶運(yùn)行的所有進(jìn)程。
比如,用戶 harry 現(xiàn)在運(yùn)行如下幾個(gè)進(jìn)程:
- [alvin@VM_0_16_centos test]$ ps aux | grep harry
- root 13675 0.0 0.2 148236 5584 ? Ss 14:55 0:00 sshd: harry [priv]
- harry 13677 0.0 0.1 148236 2944 ? S 14:55 0:00 sshd: harry@pts/1
- root 13678 0.0 0.2 148236 5444 ? Ss 14:55 0:00 sshd: harry [priv]
- harry 13680 0.0 0.1 148236 2252 ? S 14:55 0:00 sshd: harry@notty
- harry 13681 0.0 0.1 53228 2168 ? Ss 14:55 0:00 /usr/libexec/openssh/sftp-server
- harry 13694 0.0 0.1 116436 3252 pts/1 Ss+ 14:55 0:00 -bash
- harry 13948 0.0 0.0 4152 344 pts/1 S 14:57 0:00 ./hello1
- harry 13952 0.0 0.0 4152 344 pts/1 S 14:57 0:00 ./hello2
- harry 13959 0.0 0.0 4152 344 pts/1 S 14:57 0:00 ./hello3
- alvin 14005 0.0 0.0 112648 964 pts/0 R+ 14:58 0:00 grep --color=auto harry
我們現(xiàn)在想殺死 harry 所運(yùn)行的所有進(jìn)程,可以以如下方式操作:
- killall -u harry
運(yùn)行結(jié)果如下:
- [alvin@VM_0_16_centos test]$ sudo killall -u harry
- [alvin@VM_0_16_centos test]$ ps aux | grep harry
- alvin 14040 0.0 0.0 112648 964 pts/0 R+ 14:58 0:00 grep --color=auto harry
但是,這個(gè)選項(xiàng)要慎用,因?yàn)樗鼤?huì)把該用戶所有進(jìn)程,包括終端進(jìn)程,全部殺死,將導(dǎo)致該用戶直接退出。所以,如果不想挨揍的話不要輕意嘗試這個(gè)選項(xiàng)。
3、終于時(shí)間的方式終止進(jìn)程
假如我們現(xiàn)在運(yùn)行了很多程序,我們只想殺死運(yùn)行時(shí)間超過(guò) 5h 的進(jìn)程,那么可以使用 -o 選項(xiàng),其中 o 代表 older 如下:
- killall -o 5h
同樣地,如果你想殺死進(jìn)行時(shí)間小于 4h 的進(jìn)程,那么可以使用 -y 選項(xiàng),其中 y 代表 younger ,如下:
- killall -y 4h
這兩個(gè)選項(xiàng)同樣非常粗暴,也會(huì)把終端退出,所以先不演示了。
4、忽略大小寫(xiě)
默認(rèn)情況下,killall 命令是大小寫(xiě)敏感的,所以我們?nèi)绻麑?xiě)錯(cuò)大小寫(xiě),將無(wú)法正確殺死進(jìn)程。
- [alvin@VM_0_16_centos test]$ killall HELLO1
- TEST1: no process found
如果我們想忽略大小寫(xiě),可以加上 -I (大寫(xiě)字母 i )選項(xiàng)。
- [alvin@VM_0_16_centos test]$ killall -I HELLO1
- [1] Terminated ./hello1
5、關(guān)閉命令執(zhí)行回顯
默認(rèn)情況下,killall 會(huì)告訴你命令執(zhí)行情況,但是,我們?nèi)绻魂P(guān)心它的執(zhí)行結(jié)果,只想讓它靜默執(zhí)行,該怎么辦?只需加上 -q 選項(xiàng)即可,其中 q 表示 quite , 如下:
- [alvin@VM_0_16_centos test]$ killall HELLO2
- HELLO2: no process found
- [alvin@VM_0_16_centos test]$ killall -q HELLO2
- [alvin@VM_0_16_centos test]$
6、列出所有支持的信號(hào)
如前文所述,默認(rèn)情況下,killall 命令將發(fā)送 SIGTERM 信號(hào),那么,安可以發(fā)送其它信號(hào)嗎?當(dāng)然是可以的??梢允褂?-l 選項(xiàng)查看 killall 所支持的所有信號(hào):
- [alvin@VM_0_16_centos test]$ 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
你可以使用 -s 選項(xiàng)(后面跟一個(gè)信號(hào)名)來(lái)向一個(gè)進(jìn)程發(fā)送特殊信號(hào)。
7、交互式操作
如果你在殺死多個(gè)進(jìn)程時(shí)不太放心,擔(dān)心把不該殺死的進(jìn)程給殺死了,那么你可以使用 -i 選項(xiàng),這樣就可以自由決定哪些進(jìn)程應(yīng)該被殺死,哪些進(jìn)程應(yīng)該被保留。
- [alvin@VM_0_16_centos test]$ killall -i hello*
- Kill hello2(13825) ? (y/N) y
- Kill hello3(13831) ? (y/N) N
- hello: no process found
- hello1: no process found
- hello3: no process found
- hello.c: no process found
- [2]- Terminated ./hello2
8、等待直到某個(gè)進(jìn)程被終止
當(dāng)一個(gè)信號(hào)被發(fā)送至某個(gè)進(jìn)程,如果你想確定該進(jìn)程已經(jīng)被殺死了才返回執(zhí)行結(jié)果,可以使用 -w 選項(xiàng),其中 w 代表 wait ,如下:
- [alvin@VM_0_16_centos test]$ killall -w hello1
- [4]+ Terminated ./hello1
這里好像看不出什么效果,但實(shí)際執(zhí)行的時(shí)候,可以發(fā)現(xiàn)執(zhí)行結(jié)果會(huì)在一兩秒后出現(xiàn),而不加 -w 選項(xiàng)的話,執(zhí)行結(jié)果馬上就顯示。