Linux下使用killall命令終止程序的8大用法
Linux 的命令列提供很多命令來殺死程序。比如,你可以向 kill 命傳遞一個PID來殺死程序;pkill 命令使用一個正則表示式作為輸入,所以和該模式匹配的程序都被殺死。
但是還有一個命令叫 killall ,預設情況下,它精確地匹配引數名,然後殺死匹配程序。在這篇文章中,我們將討論有關這個命令的實際應用。
預設情況下,killall 命令將向一個/組程序傳送一個 SIGTERM 訊號,但是,也可以通過引數傳送一個指定的訊號。
下面我們通過例子詳細介紹 killall 的 8 大用法。
1、基本用法
假如我們 3 個程序在執行,分別是 hello1, hello2, hello3 ,現在我們想殺死 hello1 程序,可以直接使用如下方式:
- killall hello1
執行的結果如下:
- [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 程序已經被殺死了。
剩下的 hello2 和 hello3 程序,我們想一次性殺死他們,也就是批量殺死程序,可以如下操作:
- [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 開頭的程序全部被幹掉。
2、終止某個使用者所執行的程序
我們可以殺死以滿足某個正則表示式的一組程序,同樣的,我們也可以殺死某個使用者執行的所有程序。
比如,使用者 harry 現在執行如下幾個程序:
- [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
我們現在想殺死 harry 所執行的所有程序,可以以如下方式操作:
- killall -u harry
執行結果如下:
- [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
但是,這個選項要慎用,因為它會把該使用者所有程序,包括終端程序,全部殺死,將導致該使用者直接退出。所以,如果不想捱揍的話不要輕意嘗試這個選項。
3、終於時間的方式終止程序
假如我們現在運行了很多程式,我們只想殺死執行時間超過 5h 的程序,那麼可以使用 -o 選項,其中 o 代表 older 如下:
- killall -o 5h
同樣地,如果你想殺死進行時間小於 4h 的程序,那麼可以使用 -y 選項,其中 y 代表 younger ,如下:
- killall -y 4h
這兩個選項同樣非常粗暴,也會把終端退出,所以先不演示了。
4、忽略大小寫
預設情況下,killall 命令是大小寫敏感的,所以我們如果寫錯大小寫,將無法正確殺死程序。
- [alvin@VM_0_16_centos test]$ killall HELLO1
- TEST1: no process found
如果我們想忽略大小寫,可以加上 -I (大寫字母 i )選項。
- [alvin@VM_0_16_centos test]$ killall -I HELLO1
- [1] Terminated ./hello1
5、關閉命令執行回顯
預設情況下,killall 會告訴你命令執行情況,但是,我們如果不關心它的執行結果,只想讓它靜默執行,該怎麼辦?只需加上 -q 選項即可,其中 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、列出所有支援的訊號
如前文所述,預設情況下,killall 命令將傳送 SIGTERM 訊號,那麼,安可以傳送其它訊號嗎?當然是可以的。可以使用 -l 選項檢視 killall 所支援的所有訊號:
- [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 選項(後面跟一個訊號名)來向一個程序傳送特殊訊號。
7、互動式操作
如果你在殺死多個程序時不太放心,擔心把不該殺死的程序給殺死了,那麼你可以使用 -i 選項,這樣就可以自由決定哪些程序應該被殺死,哪些程序應該被保留。
- [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、等待直到某個程序被終止
當一個訊號被髮送至某個程序,如果你想確定該程序已經被殺死了才返回執行結果,可以使用 -w 選項,其中 w 代表 wait ,如下:
- [alvin@VM_0_16_centos test]$ killall -w hello1
- [4]+ Terminated ./hello1
這裡好像看不出什麼效果,但實際執行的時候,可以發現執行結果會在一兩秒後出現,而不加 -w 選項的話,執行結果馬上就顯示。
覺得不錯請點贊支援,歡迎留言或進我的個人群855801563領取【架構資料專題目合集90期】、【BATJTMD大廠JAVA面試真題1000+】,本群專用於學習交流技術、分享面試機會,拒絕廣告,我也會在群內不定