首頁  >  文章  >  運維  >  linux如何殺死進程

linux如何殺死進程

WBOY
WBOY轉載
2023-05-21 19:28:101353瀏覽

常規篇:

首先,用ps查看進程,方法如下:

複製程式碼 程式碼如下:

$ ps -ef

$ ps -ef

……
smx       1822     1  0 11:38 ?        00:00:49 38 ?       38 ?        00:00:00 gnome -pty-helper
smx       1824  1822  0 11:38 pts/0    00:00:02 bash
smx  00:26:28 /usr/lib/firefox-3.6.18/ firefox-bin
smx       1857  1822  0 11:38 pts/1    00:00:00 bash
smx   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 3  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:0    ss   11:38   0:002 b .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.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   r    21:42   0:00 ps   r    21:42   0:00 ps) -
在此時我想殺瞭如果我想殺瞭如果我想殺了1100 ps
#在此時我想殺了零的進程。

複製程式碼 程式碼如下:

$ 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 ?11827     1  4 11:38 ?1:   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 '{print $2}' | xargs kill -9
kill: no such process

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

其中awk '{print $2}' 的作用就是印出(print)出第二列的內容。根據常規篇,可以知道ps輸出的第二列剛好是pid。就把進程對應的pid透過xargs傳遞給kill作參數,殺掉對應的進程。

改進7:

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

複製程式碼 程式碼如下:

$kill -s 9 `ps -aux | grep firefox | awk '{print $2}'

改進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如何殺死進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除