linux下殺死程序(kill)的N種方法

2021-07-05 20:29:39 字數 3447 閱讀 7242

常規篇:

首先,用ps檢視程序,方法如下:

$ ps -ef

……smx       1822     1  0 11:38 ?        00:00:49 gnome-terminal

smx       1823  1822  0 11:38 ?        00:00:00 gnome-pty-helper

smx       1824  1822  0 11:38 pts/0    00:00:02 bash

smx       1827     1  4 11:38 ?        00:26:28 /usr/lib/firefox-3.6.18/firefox-bin

smx       1857  1822  0 11:38 pts/1    00:00:00 bash

smx       1880  1619  0 11:38 ?        00:00:00 update-notifier

……smx      11946  1824  0 21:41 pts/0    00:00:00 ps -ef

或者:$ ps -aux

smx       1822  0.1  0.8  58484 18152 ?        sl   11:38   0:49 gnome-terminal

smx       1823  0.0  0.0   1988   712 ?        s    11:38   0:00 gnome-pty-helper

smx       1824  0.0  0.1   6820  3776 pts/0    ss   11:38   0:02 bash

smx       1827  4.3  5.8 398196 119568 ?       sl   11:38  26:13 /usr/lib/firefox-3.6.18/firefox-bin

smx       1857  0.0  0.1   6688  3644 pts/1    ss   11:38   0:00 bash

smx       1880  0.0  0.6  41536 12620 ?        s    11:38   0:00 update-notifier

……smx      11953  0.0  0.0   2716  1064 pts/0    r+   21:42   0:00 ps -aux

此時如果我想殺了火狐的程序就在終端輸入:

$ kill -s 9 1827

其中-s 9 制定了傳遞給程序的訊號是9,即強制、盡快終止程序。各個終止訊號及其作用見附錄。

1827則是上面ps查到的火狐的pid。

簡單吧,但有個問題,程序少了則無所謂,程序多了,就會覺得痛苦了,無論是ps -ef 還是ps -aux,每次都要在一大串程序資訊裡面查詢到要殺的程序,看的眼都花了。

高階篇:

改進1:

把ps的查詢結果通過管道給grep查詢包含特定字串的程序。管道符「|」用來隔開兩個命令,管道符左邊命令的輸出會作為管道符右邊命令的輸入。

$ ps -ef | grep firefox

smx       1827     1  4 11:38 ?        00:27:33 /usr/lib/firefox-3.6.18/firefox-bin

smx      12029  1824  0 21:54 pts/0    00:00:00 grep --color=auto firefox

這次就清爽了。然後就是

$kill -s 9 1827

還是嫌打字多?

改進2——使用pgrep:

一看到pgrep首先會想到什麼?沒錯,grep!pgrep的p表明了這個命令是專門用於程序查詢的grep。

$ pgrep firefox

1827

看到了什麼?沒錯火狐的pid,接下來又要打字了:

$kill -s 9 1827

改進3——使用pidof:

看到pidof想到啥?沒錯pid of xx,字面翻譯過來就是 xx的pid。

$ pidof firefox-bin

1827

和pgrep相比稍顯不足的是,pidof必須給出程序的全名。然後就是老生常談:

$kill -s 9 1827

無論使用ps 然後慢慢查詢程序pid 還是用grep查詢包含相應字串的程序,亦或者用pgrep直接查詢包含相應字串的程序pid,然後手動輸入給kill殺掉,都稍顯麻煩。有沒有更方便的方法?有!

改進4:

$ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9

說明:「grep firefox」的輸出結果是,所有含有關鍵字「firefox」的程序。

「grep -v grep」是在列出的程序中去除含有關鍵字「grep」的程序。

「cut -c 9-15」是擷取輸入行的第9個字元到第15個字元,而這正好是程序號pid。

「xargs kill -s 9」中的xargs命令是用來把前面命令的輸出結果(pid)作為「kill -s 9」命令的引數,並執行該命令。「kill -s 9」會強行殺掉指定程序。

難道你不想抱怨點什麼?沒錯太長了

改進5:

知道pgrep和pidof兩個命令,幹嘛還要打那麼長一串!

$ pgrep firefox | xargs kill -s 9

改進6:

$ ps -ef | grep firefox | awk '' | xargs kill -9

kill: no such process

有乙個比較鬱悶的地方,程序已經正確找到並且終止了,但是執行完卻提示找不到程序。

其中awk '' 的作用就是列印(print)出第二列的內容。根據常規篇,可以知道ps輸出的第二列正好是pid。就把程序相應的pid通過xargs傳遞給kill作引數,殺掉對應的程序。

改進7:

難道每次都要呼叫xargs把pid傳遞給kill?答案是否定的:

$kill -s 9 `ps -aux | grep firefox | awk ''`

改進8:

沒錯,命令依然有點長,換成pgrep。

$kill -s 9 `pgrep firefox`

改進9——pkill:

看到pkill想到了什麼?沒錯pgrep和kill!pkill=pgrep+kill。

$pkill -9 firefox

說明:"-9" 即傳送的訊號是9,pkill與kill在這點的差別是:pkill無須 「s」,終止訊號等級直接跟在 「-「 後面。之前我一直以為是 "-s 9",結果每次執行都無法終止程序。

改進10——killall:

killall和pkill是相似的,不過如果給出的程序名不完整,killall會報錯。pkill或者pgrep只要給出程序名的一部分就可以終止程序。

$killall -9 firefox

linux下殺死程序(kill)的N種方法

常規篇 首先,用ps檢視程序,方法如下 ps ef smx 1822 1 0 11 38 00 00 49 gnome terminal smx 1823 1822 0 11 38 00 00 00 gnome pty helper smx 1824 1822 0 11 38 pts 0 00 00...

kill 和killall 殺死程序

1 根據程序ip檢視程序名 liunx中 通過程序名查詢程序pid可以通過 pidof 程序名 來查詢。反過來 通過pid查詢程序名則沒有相關命令。但在linux根目錄中,有乙個 proc的vfs 虛擬檔案系統 系統當前執行的所有程序都對應於該目錄下的乙個 以程序pid命名的資料夾 其中存放程序執行...

kill 和killall 殺死程序

1 根據程序ip檢視程序名 liunx中 通過程序名查詢程序pid可以通過 pidof 程序名 來查詢。反過來 通過pid查詢程序名則沒有相關命令。但在linux根目錄中,有乙個 proc的vfs 虛擬檔案系統 系統當前執行的所有程序都對應於該目錄下的乙個 以程序pid命名的資料夾 其中存放程序執行...