long long ago,曾有一個想法,就是完全脫離windows,使用linux生活、工作。以前迫於各種專業工具不支持linux,只能無奈的使用xp。最近工作內 容是android移植+單片機開發,android就不說了,必須用linux開發。單片機也找到一些linux的工具,於是乎有不少時間是在 linux上進行開發工作。自然而然的,經常要進程管理。linux的進程管理手段豐富。想怎麼殺進程都可以。廢話少說,正題開始:
常規篇:
首先,用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 | <span class="hljs-keyword"><span class="hljs-keyword">grep</span></span> firefox | awk <span class="hljs-string"><span class="hljs-string">'{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的信號直接跟在 “-“ 後面,“-sxx”不是用來傳遞信號。之前我一直以爲是 “-s 9”,結果每次運行都無法終止進程。
改進10——killall:
killall和pkill是相似的,不過如果給出的進程名不完整,killall會報錯。pkill或者pgrep只要給出進程名的一部分就可以終止進程。
$killall -9 firefox
總結:
1、
1)kill傳遞給要終止的進程的信號,實際上是POSIX信號,它們在signal.h裏面定義附錄摘錄了部分POSIX信號,及其相關說明。支持兩種方式傳遞終止信號:
- (1)kill -s signal PID
- 比如
- $ kill -s 9 1234
(2)kill -signal PID
$kill -9 1234
2)kill傳遞的信號也支持兩種表示方式:信號名和信號數:
kill -s 9 1234 和kill -s KILL 1234 (SIGKILL)
kill -15 1234 和kill -TERM 1234 (SIGTERM)
當然其他信號也可以這樣表示。
2、
上面各種改進方法,設計到的技巧,有兩個在其他地方也有借鑑意義。
1)、進程號的獲取部分
用awk提取第2列或者用cut提取第8-15個字母。其他地方也可一用awk提取第n列,或者用cut提取第m-第n哥字母。
2)、進程號的傳遞
用xargs把進程號傳遞給後面的kill做參數運行;
直接用兩個“`”(“~”下面那個後單引號)把命令放到對應參數的位置來傳遞參數。
附錄:各種信號及其用途
信號 | 描述 | Linux x86[1] 的信號數 |
---|---|---|
SIGABRT | 進程退出 | 6 |
SIGALRM | 計時器到時 | 14 |
SIGBUS | 總線錯誤,進入內存對象未定義部分 | 7 |
SIGCHLD | 子進程終止,停止或繼續 | 17 |
SIGCONT | 繼續,如果停止 | 18 |
SIGFPE | 浮點指針異常,錯誤的算數操作。 | 8 |
SIGHUP | 掛起 | 1 |
SIGILL | 非法指令 | 4 |
SIGINT | 中斷 | 2 |
SIGKILL | 殺死(儘快終止) | 9 |
SIGPIPE | 無讀操作時寫入管道。 | 13 |
SIGQUIT | 退出並轉儲核心 | 3 |
SIGSEGV | 段非法 | 11 |
SIGSTOP | 臨時停止執行 | 19 |
SIGTERM | 終止(要求終止) | 15 |
SIGTSTP | 由信號終止 | 20 |
SIGTTIN | 後臺進程試圖從TTY 讀入 (“in”) | 21 |
SIGTTOU | 後臺進程試圖寫入TTY (“out”) | 22 |
SIGUSR1 | 用戶定義1 | 10 |
SIGUSR2 | 用戶定義2 | 12 |
SIGPOLL | Pollable event | 29 |
SIGPROF | 統計分佈圖用計時器到時 | 27 |
SIGSYS | 不良的系統調用 | 31 |
SIGTRAP | 跟蹤/斷點 陷阱 | 5 |
SIGURG | I/O緊急信號,套接字緊急數據有效 | 23 |
SIGVTALRM | 虛擬定時器超時 | 26 |
SIGXCPU | 超出CPU時間限制 | 24 |
SIGXFSZ | 超出文件大小限制 | 25 |
</div>