Linux kill進程

 

long long ago,曾有一個想法,就是完全脫離windows,使用linux生活、工作。以前迫於各種專業工具不支持linux,只能無奈的使用xp。最近工作內 容是android移植+單片機開發,android就不說了,必須用linux開發。單片機也找到一些linux的工具,於是乎有不少時間是在 linux上進行開發工作。自然而然的,經常要進程管理。linux的進程管理手段豐富。想怎麼殺進程都可以。廢話少說,正題開始:

常規篇

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

  1. $ ps -ef
  2. ……
  3. smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal
  4. smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper
  5. smx 1824 1822 0 11:38 pts/0 00:00:02 bash
  6. smx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin
  7. smx 1857 1822 0 11:38 pts/1 00:00:00 bash
  8. smx 1880 1619 0 11:38 ? 00:00:00 update-notifier
  9. ……
  10. smx 11946 1824 0 21:41 pts/0 00:00:00 ps -ef


或者:

  1. $ ps -aux
  2. ……
  3. smx 1822 0.1 0.8 58484 18152 ? Sl 11:38 0:49 gnome-terminal
  4. smx 1823 0.0 0.0 1988 712 ? S 11:38 0:00 gnome-pty-helper
  5. smx 1824 0.0 0.1 6820 3776 pts/0 Ss 11:38 0:02 bash
  6. smx 1827 4.3 5.8 398196 119568 ? Sl 11:38 26:13 /usr/lib/firefox-3.6.18/firefox-bin
  7. smx 1857 0.0 0.1 6688 3644 pts/1 Ss 11:38 0:00 bash
  8. smx 1880 0.0 0.6 41536 12620 ? S 11:38 0:00 update-notifier
  9. ……
  10. 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查找包含特定字符串的進程。管道符“|”用來隔開兩個命令,管道符左邊命令的輸出會作爲管道符右邊命令的輸入。

  1. $ ps -ef | grep firefox
  2. smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin
  3. 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。

  1. $ pgrep firefox
  2. 1827


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

$kill -s 9 1827


改進3——使用pidof:

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

  1. $ pidof firefox-bin
  2. 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:

  1. $ 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
  2. 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. 1kill -s signal PID
  2. 比如
  3. $ 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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章