linux ps -ef命令输出详解,Linux-ps命令学习
由于ps命令涉及的內容比較多一些,這里單獨使用一篇文章來介紹使用。使用的系統是:CentOS 7.4.17.08。
ps命令是Process Status的縮寫,用來列出系統中當前運行的進程。使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等。ps命令所列出的進行是當前進程的快照,也就是并不是動態的,而是執行該命令時那一時刻進行的狀態。而經常和ps一起結合使用的殺死進程的是kill命令。
在我們的學習中我們知道,Linux的進程狀態一般分為幾種:
R(TASK_RUNNING,可執行狀態),這個進程是可運行的——要么它正在運行,要么在運行隊列中等待運行;
S(TASK_INTERRUPTIBLE,中斷狀態),這個狀態的進程因為等待某事件的發生(比如等待socket連接、等待信號量等)而被掛起,然后當這些事件發生或完成后,對應的等待隊列中的一個或多個進程將被喚醒。
D(TASK_UNINTERRUPTIBLE,不可中斷狀態),在進程接收到信號時,不會被喚醒變成可運行的。除了這一點,該狀態和TASK_INTERRUPTIBLE其他部分完全一樣,這個狀態通常用于進程必須不間斷等待或者事件發生的頻率很快,并且無法用kill命令關閉處于TASK_UNINTERRUPTIBLE狀態的進程。
T(TASK_STOPPED或TASK_TRACED,暫停狀態或跟蹤狀態),該狀態表示該進程已經停止執行,并且不具有再次執行的條件。向進程發送一個SIGSTOP信號,它就會因響應該信號而進入TASK_STOPPED狀態(除非該進程本身處于TASK_UNINTERRUPTIBLE狀態而不響應信號)。而當進程正在被跟蹤時,它處于TASK_TRACED狀態。
Z(TASK_DEAD或EXIT_ZOMBIE,退出狀態),進程在退出的過程中,處于TASK_DEAD狀態,如果它的父進程沒有收到SIGCHLD信號,故未調用wait(如wait4、waitid)處理函數等待子進程結束,又沒有顯式忽略該信號,它就一直保持EXIT_ZOMBIE狀態。只要父進程不退出,這個EXIT_ZOMBIE狀態的子進程就一直存在,這也就是所謂的"僵尸"進程。
X(TASK_DEAD - EXIT_DEAD,退出狀態),進程即將被銷毀。EXIT_DEAD狀態是非常短暫的,幾乎不可能通過ps命令捕捉到。
而PS對應上的狀態碼大致如下:
狀態
定義
R
Running.運行中
S
Interruptible Sleep.等待調用
D
Uninterruptible Sleep.等待磁盤IO
T
Stoped.暫停或者跟蹤狀態
X
Dead.即將被撤銷
Z
Zombie.進程已經結束,僅映像名留存,所謂的僵尸進程
W
Paging.內存交換
N
優先級低的進程
<
優先級高的進程
s
進程的領導者
L
鎖定狀態
l
多線程狀態
+
前臺進程
而我們最常見的三種狀態就是R,S,D。ps命令支持三種使用的語法格式:
UNIX 風格,選項可以組合在一起,并且選項前必須有“-”連字符;
BSD 風格,選項可以組合在一起,但是選項前不能有“-”連字符;
GNU 風格的選項,選項前有兩個“-”連字符;
接下來我們來看一下PS命令常用的參數:
ps -a 顯示所有終端下執行的進程,包含其他用戶的進程
ps -A 顯示所有進程
ps -e 和-A功能一樣
ps -H 顯示樹狀結構,表示程序間的相互關系
ps -f 全格式顯示進程
ps a 顯示當前終端下執行的進程
ps c 顯示進程的真實名稱
ps e 列出程序所使用的環境變量
ps f 用ASCII字符顯示樹狀結構,表達程序間的相互關系
ps x 顯示所有進程,無論是否運行在終端上
ps u 顯示用戶相關的進程或者與用戶相關的屬性
ps r 只顯示正在運行的進程
這里,我們只簡單列出了幾個常用的命令,由于ps作為一個最古老的展示線程相關的命令,所擁有的參數特別多,并且加不加-也有很大的區別,所以接下來我們結合工作中常用的命令來學習它的參數。而我們也可以通過man ps來學習ps所有的命令:
不加參數執行ps命令:展示當前終端中運行的進程情況,很少使用。
[mrzhang@192 ~]$ ps
PID TTY TIME CMD
2648 pts/0 00:00:01 bash
8669 pts/0 00:00:00 ps
默認展示了4列信息:
PID: 運行著的命令(CMD)的進程編號
TTY: 命令所運行的位置(終端)
TIME: 運行著的該命令所占用的CPU處理時間
CMD: 該進程所運行的命令
顯示所有當前的進程:使用 -a 參數,-a 代表 all。同時加上x參數會顯示沒有控制終端的進程,x參數表示顯示所有進程,無論是否運行在終端上。
[mrzhang@192 ~]$ ps -ax
該命令返回的結果會很長,為了方便查看,我們可以結合less命令和管道來使用:
[mrzhang@192 ~]$ ps -ax | less
根據用戶過濾進程:在需要查看特定用戶進程的情況下,我們可以使用 -u 參數。比如我們要查詢某個用戶下的進程:
[mrzhang@192 ~]$ ps -u zhang
通過CPU和內存使用來過濾進程:也許你想看下當前時間點那個進程占用的資源最多,這種情況下,我們可以通過使用-aux命令來顯示全面的信息:
[mrzhang@192 ~]$ ps -aux | less
默認的結果是沒有排序的,這時候可以通過--sort參數來排序:
[mrzhang@192 ~]$ ps -aux --sort -%cpu | less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mrzhang 2011 3.6 3.1 2368492 121944 ? Sl 21:01 0:12 /usr/bin/gnome-shell
mrzhang 2572 3.2 5.5 2146148 211300 ? Sl 21:02 0:09 /usr/lib64/firefox/firefox
root 1519 1.2 1.1 286208 45584 tty1 Ssl+ 21:01 0:04 /usr/bin/X :0 -background none -noreset -audit 4
看一下返回的幾列信息:
USER,用戶名稱;
PID,進程號;
%CPU,該進程所占用CPU百分比;
%MEM,該進程所占用內存百分比;
VSZ,進程所占用的虛擬內存大小;
RSS,進程所占用的實際內存大小;
TTY,該進程運行在哪個終端上面,若與終端無關,則顯示 ?;
STAT,進程狀態;
START,進程啟動時間;
TIME,進程實際占用CPU的時間;
COMMAND,該進程對應的執行程序;
ps命令的排序格式是:--sort=[+|-] key,key表示某一列的名稱,+表示升序排序,而-表示降序排序,比如按CPU降序排列:ps aux --sort=-%cpu,按照內存來進行降序排序:$ ps -aux --sort -%mem | less,我們還可以借助管道只顯示前5條記錄結果,也就是內存占有率最高的前5個進程:
[mrzhang@192 ~]$ ps -aux --sort %mem | head -n 5
而ps排序的方式還有另一種:ps+sort,通過設置sort的參數來進行排序,例如:
[mrzhang@192 ~]$ ps -eo rss,args | sort -k 1 -r -n | less
該方式的一些參數如下:
-f 忽略大小寫的差異,例如 A 與 a 視為編碼相同;
-b 忽略最前面的空格符部分;
-M 以月份的名字來排序,例如 JAN, DEC 等等的排序方法;
-n 使用『純數字』進行排序(默認是以文字型態來排序的);
-r 反向排序;
-u 就是 uniq ,相同的數據中,僅出現一行代表;
-t 分隔符,默認是用 [tab] 鍵來分隔;
-k 以那個區間 (field) 來進行排序的意思
根據進程名和PID來過濾,通過使用-C參數,后面跟上進程名,比如像顯示一個名稱是getty的進程的信息,可以使用:
[mrzhang@192 ~]$ ps -C bash
PID TTY TIME CMD
2686 pts/0 00:00:00 bash
根據進程查看線程,如果我們像知道特定線程的進程,可以使用-L參數,后面加上對應的進程的PID:
[mrzhang@192 ~]$ ps -L 2011
PID LWP TTY STAT TIME COMMAND
2011 2011 ? Sl 0:25 /usr/bin/gnome-shell
2011 2012 ? Sl 0:00 /usr/bin/gnome-shell
2011 2014 ? Sl 0:00 /usr/bin/gnome-shell
2011 2015 ? Sl 0:00 /usr/bin/gnome-shell
2011 2028 ? Sl 0:00 /usr/bin/gnome-shell
2011 2029 ? Sl 0:00 /usr/bin/gnome-shell
樹形顯示進程,可以通過參數f來實現:ps -axf,也可以使用pstree命令;
[mrzhang@192 ~]$ ps -axf
1773 ? Sl 0:00 \_ gdm-session-worker [pam/gdm-password]
1791 ? Ssl 0:00 \_ /usr/libexec/gnome-session-binary --session g
1965 ? Ss 0:00 \_ /usr/bin/ssh-agent /bin/sh -c exec -l /bi
2011 ? Sl 0:29 \_ /usr/bin/gnome-shell
2031 ? Sl 0:00 | \_ ibus-daemon --xim --panel disable
2036 ? Sl 0:00 | \_ /usr/libexec/ibus-dconf
2267 ? Sl 0:00 | \_ /usr/libexec/ibus-engine-simple
2162 ? Sl 0:03 \_ /usr/libexec/gnome-settings-daemon
查看登入服務器的其他用戶信息,可以使用:$ ps -eo pid,user,args,-e表示顯示所有進程信息,o用于參數控制輸出,pid,user,args是相應的用戶的展示信息。
使用ps命令來實時監控進程的狀態,一般情況下ps命令的結果是靜態的,也就是命令執行時的狀態,不過我們可以通過watch命令和ps命令一起來實現。比如我們想通過CPU或者內存的使用率來篩選前10條進程,并且每1秒刷新一次:
[mrzhang@192 ~]$ watch -n 1 'ps -aux --sort -%mem | head 10'
Every 1.0s: ps -aux --sort -%mem | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mrzhang 2011 3.6 3.1 2368492 121944 ? Sl 21:01 0:12 /usr/bin/gnome-shell
mrzhang 2572 3.2 5.5 2146148 211300 ? Sl 21:02 0:09 /usr/lib64/firefox/firefox
root 1519 1.2 1.1 286208 45584 tty1 Ssl+ 21:01 0:04 /usr/bin/X :0 -background none -noreset -audit 4
...省略
這里,我們可以充分利用ps命令的一些參數,實現自定義顯示我們所需要的一些字段等,比如我們只想查看某一個用戶的信息:
[mrzhang@192 ~]$ watch -n 1 'ps -U mrzhang u --sort -%mem | head 10'
Every 1.0s: ps -U mrzhang u --sort -%mem | head -n 10
...
我們還可以配合grep查找命令來進行查找一些特定的線程,比如我們要根據我們的服務名來查找對應的進程:
[mrzhang@192 ~]$ ps -aux | grep 服務名
把進程顯示出來,并打印到相應文件中:
[mrzhang@192 ~]$ ps -aux > ps001.txt
備注
ps的命令十分強大,參數也十分多,這里我們只了解了一些常用的操作所涉及到的命令,其實還有許多命令,我們可以通過man ps來了解并學習。
總結
以上是生活随笔為你收集整理的linux ps -ef命令输出详解,Linux-ps命令学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当我百度${}……
- 下一篇: android+ble室内定位,基于BL