linux下查看進城(ps)的方法 與 殺死進程(kill)的N種方法


PS查看進程

inux上進程有5種狀態: 
1. 運行(正在運行或在運行隊列中等待) 
2. 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到信號) 
3. 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生) 
4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用后釋放) 
5. 停止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號后停止運行運行)

ps工具標識進程的5種狀態碼: 
D 不可中斷 uninterruptible sleep (usually IO) 
R 運行 runnable (on run queue) 
S 中斷 sleeping 
T 停止 traced or stopped 
Z 僵死 a defunct (”zombie”) process

名稱:ps 
使用權限:所有使用者 
使用方式:ps [options] [--help] 
說明:顯示瞬間行程 (process) 的動態 
參數: 
ps 的參數非常多, 在此僅列出幾個常用的參數並大略介紹含義 
-A 列出所有的行程 
-w 顯示加寬可以顯示較多的資訊 
-au 顯示較詳細的資訊 
-aux 顯示所有包含其他使用者的行程

au(x) 輸出格式 :

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 
USER: 行程擁有者 
PID: pid 
%CPU: 占用的 CPU 使用率 
%MEM: 占用的記憶體使用率 
VSZ: 占用的虛擬記憶體大小 
RSS: 占用的記憶體大小 
TTY: 終端的次要裝置號碼 (minor device number of tty) 
STAT: 該行程的狀態: 
D: 不可中斷的靜止 
R: 正在執行中 
S: 靜止狀態 
T: 暫停執行 
Z: 不存在但暫時無法消除 
W: 沒有足夠的記憶體分頁可分配 
<: 高優先序的行程 
N: 低優先序的行程 
L: 有記憶體分頁分配並鎖在記憶體內 (即時系統或捱A I/O) 
START: 行程開始時間 
TIME: 執行的時間 
COMMAND:所執行的指令

范例:

ps 
PID TTY TIME CMD 
2791 ttyp0 00:00:00 tcsh 
3092 ttyp0 00:00:00 ps 
% ps -A 
PID TTY TIME CMD 
1 ? 00:00:03 init 
2 ? 00:00:00 kflushd 
3 ? 00:00:00 kpiod 
4 ? 00:00:00 kswapd 
5 ? 00:00:00 mdrecoveryd 
……. 
% ps -aux 
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 
root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3] 
root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd] 
root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod] 
root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]

具體命令解釋如下: 
1)ps a 顯示現行終端機下的所有程序,包括其他用戶的程序。

2)ps -A 顯示所有程序。

3)ps c 列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,參數或常駐服務的標示。

4)ps -e 此參數的效果和指定”A”參數相同。

5)ps e 列出程序時,顯示每個程序所使用的環境變量。

6)ps f 用ASCII字符顯示樹狀結構,表達程序間的相互關系。

7)ps -H 顯示樹狀結構,表示程序間的相互關系。

8)ps -N 顯示所有的程序,除了執行ps指令終端機下的程序之外。

9)ps s 采用程序信號的格式顯示程序狀況。

10)ps S 列出程序時,包括已中斷的子程序資料。

11)ps -t<終端機編號>

指定終端機編號,並列出屬於該終端機的程序的狀況。

12)ps u

以用戶為主的格式來顯示程序狀況。

13)ps x

顯示所有程序,不以終端機來區分。

最常用的方法是ps -aux,然后再利用一個管道符號導向到grep去查找特定的進程,然后再對特定的進程進行操作。

FROM: http://blog.csdn.net/cjh6311882/article/details/7611967

linux下grep命令詳解

1.作用 
Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹 配的行打印出來。grep全稱是Global Regular Expr ession Print,表示全局正則表達式版本,它的使用權限是所有用戶。

2.格式 
grep [options]

3.主要參數 
[options]主要參數: 
-c:只輸出匹配行的計數。 
-I:不區分大 小寫(只適用於單字符)。 
-h:查詢多文件時不顯示文件名。 
-l:查詢多文件時只輸出包含匹配字符的文件名。 
-n:顯示匹配行及 行號。 
-s:不顯示不存在或無匹配文本的錯誤信息。 
-v:顯示不包含匹配文本的所有行。 
pattern正則表達式主要參數: 
\: 忽略正則表達式中特殊字符的原有含義。 
^:匹配正則表達式的開始行。 
$: 匹配正則表達式的結束行。 
\<:從匹配正則表達 式的行開始。 
\>:到匹配正則表達式的行結束。 
[ ]:單個字符,如[A]即A符合要求 。 
[ - ]:范圍,如[A-Z],即A、B、C一直到Z都符合要求 。 
。:所有的單個字符。 
* :有字符,長度可以為0。

4.grep命令使用簡單實例 
$ grep ‘test’ d* 
顯示所有以d開頭的文件中包含 test的行。 
$ grep ‘test’ aa bb cc 
顯示在aa,bb,cc文件中匹配test的行。 
$ grep ‘[a-z]\{5\}’ aa 
顯示所有包含每個字符串至少有5個連續小寫字符的字符串的行。 
$ grep ‘w\(es\)t.*\1′ aa 
如果west被匹配,則es就被存儲到內存中,並標記為1,然后搜索任意個字符(.*),這些字符后面緊跟着 另外一個es(\1),找到就顯示該行。如果用egrep或grep -E,就不用”\”號進行轉義,直接寫成’w(es)t.*\1′就可以了。

5.grep命令使用復雜實例 
假設您正在’/usr/src/Linux/Doc’目錄下搜索帶字符 串’magic’的文件: 
$ grep magic /usr/src/Linux/Doc/* 
sysrq.txt:* How do I enable the magic SysRQ key? 
sysrq.txt:* How do I use the magic SysRQ key? 
其中文件’sysrp.txt’包含該字符串,討論的是 SysRQ 的功能。 
默認情況下,’grep’只搜索當前目錄。如果 此目錄下有許多子目錄,’grep’會以如下形式列出: 
grep: sound: Is a directory 
這可能會使’grep’ 的輸出難於閱讀。這里有兩種解決的辦法: 
明確要求搜索子目錄:grep -r 
或忽略子目錄:grep -d skip 
如果有很多 輸出時,您可以通過管道將其轉到’less’上閱讀: 
$ grep magic /usr/src/Linux/Documentation/* | less 
這樣,您就可以更方便地閱讀。

有一點要注意,您必需提供一個文件過濾方式(搜索全部文件的話用 *)。如果您忘了,’grep’會一直等着,直到該程序被中斷。如果您遇到了這樣的情況,按 <CTRL c> ,然后再試。

下面還有一些有意思的命令行參數: 
grep -i pattern files :不區分大小寫地搜索。默認情況區分大小寫, 
grep -l pattern files :只列出匹配的文件名, 
grep -L pattern files :列出不匹配的文件名, 
grep -w pattern files :只匹配整個單詞,而不是字符串的一部分(如匹配’magic’,而不是’magical’), 
grep -C number pattern files :匹配的上下文分別顯示[number]行, 
grep pattern1 | pattern2 files :顯示匹配 pattern1 或 pattern2 的行, 
grep pattern1 files | grep pattern2 :顯示既匹配 pattern1 又匹配 pattern2 的行。

grep -n pattern files  即可顯示行號信息

grep -c pattern files  即可查找總行數

這里還有些用於搜索的特殊符號: 
\< 和 \> 分別標注單詞的開始與結尾。 
例如: 
grep man * 會匹配 ‘Batman’、’manic’、’man’等, 
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’, 
grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。 
‘^’:指匹配的字符串在行首, 
‘$’:指匹配的字符串在行 尾,

 

 

Grep 命令 用法大全

1、 參數: 
-I :忽略大小寫 
-c :打印匹配的行數 
-l :從多個文件中查找包含匹配項 
-v :查找不包含匹配項的行 
-n:打印包含匹配項的行和行標

2、RE(正則表達式) 
\ 忽略正則表達式中特殊字符的原有含義 
^ 匹配正則表達式的開始行 
$ 匹配正則表達式的結束行 
\< 從匹配正則表達式的行開始 
\> 到匹配正則表達式的行結束 
[ ] 單個字符;如[A] 即A符合要求 
[ - ] 范圍 ;如[A-Z]即A,B,C一直到Z都符合要求 
. 所有的單個字符 
* 所有字符,長度可以為0

 

Kill  殺死進程

常規篇:

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

 

附錄:各種信號及其用途

 

Signal Description Signal number on Linux x86[1]
SIGABRT Process aborted 6
SIGALRM Signal raised by alarm 14
SIGBUS Bus error: "access to undefined portion of memory object" 7
SIGCHLD Child process terminated, stopped (or continued*) 17
SIGCONT Continue if stopped 18
SIGFPE Floating point exception: "erroneous arithmetic operation" 8
SIGHUP Hangup 1
SIGILL Illegal instruction 4
SIGINT Interrupt 2
SIGKILL Kill (terminate immediately) 9
SIGPIPE Write to pipe with no one reading 13
SIGQUIT Quit and dump core 3
SIGSEGV Segmentation violation 11
SIGSTOP Stop executing temporarily 19
SIGTERM Termination (request to terminate) 15
SIGTSTP Terminal stop signal 20
SIGTTIN Background process attempting to read from tty ("in") 21
SIGTTOU Background process attempting to write to tty ("out") 22
SIGUSR1 User-defined 1 10
SIGUSR2 User-defined 2 12
SIGPOLL Pollable event 29
SIGPROF Profiling timer expired 27
SIGSYS Bad syscall 31
SIGTRAP Trace/breakpoint trap 5
SIGURG Urgent data available on socket 23
SIGVTALRM Signal raised by timer counting virtual time: "virtual timer expired" 26
SIGXCPU CPU time limit exceeded 24
SIGXFSZ File size limit exceeded 25


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM