CentOS中ps配合Kill進程的N種方法

來源:互聯網
上載者:User

標籤:

首先,用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 

此時如果我想殺了Firefox的進程就在終端輸入: 

$ kill -s 9 1827 

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

1827則是上面ps查到的Firefox的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 

看到了什嗎?沒錯Firefox的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 

CentOS中ps配合Kill進程的N種方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.