PS 命令
登錄信息#
下面執行的命令都是基於以上的環境配置。
進程狀態#
PS 全稱是 Process Status。
風格 | 來源 | 前綴 |
---|
Unix | 貝爾實驗室的 AT&T 系統 | - |
BSD | 伯克利軟件發行版 | 無 |
GNU | GNU 組織的改進版本 | -- |
因為歷史的原因 ps
命令混雜著各種不同的風格,有時候確跟 💩 一樣。
不添加任何選項#
不添加任何選項時,它會顯示所有與當前終端相關的進程。
簡單來說,如果當前終端的 TTY 是 pts/0
,那麼他會顯示所有 TTY 是 pts/0
的進程。
通常包括 Shell 進程、從這個終端啟動的任何進程(無論是前台還是後台),以及 ps
命令本身。
上面的 sleep 進程是我使用後台進程的方式啟動的。
基礎選項#
選項:a#
顯示與終端相關的所有進程,不僅僅是當前終端或當前用戶。
上面的結果是從 pts/0
終端執行的,可以看到,終端為 ttyS0
、tty1
、pts/1
的進程都顯示出來了,
也沒有區分用戶,pts/0
、ttyS0
、tty1
是 root 的,pts/1
是 kuga 的。
選項:u#
以用戶友好的格式顯示進程信息。
如果這個選項只跟顯示字段有關,那它的進程集應該和沒有添加任何選項的 ps
命令一樣。
然而上面的結果表明,除了自身終端 pts/0
的進程,它也顯示了別的終端進程,
但它沒有顯示 pts/1
的終端進程(用戶是 kuga)。
可以簡單得出結論,u
選項的進程集就是:與當前用戶終端相關的所有進程。
上面就是與 root 用戶相關的所有終端進程,如果在 kuga 用戶的終端執行 ps u
,
可以得到下面的結果,完全符合預期。
另外這個進程集的定義不是 u
選項特有的,它和 BSD 風格有關。
選項:x#
顯示屬於當前用戶的所有進程。
上面的結果是在 kuga 用戶的終端執行的,所以進程數量不會太多。
選項:-e#
顯然所有進程。
選項:-f#
以全格式(full-format)顯示進程信息,可以與其他 UNIX-style 的選項組合使用。
選項:-o#
自定義輸出字段,不能與 -f
和 u
選項共用。
注意這裡的 uid 和使用 -f
選項顯示的內容不一樣,這裡是數字 ID,但 -f
會顯示用戶名。
選項:-p#
指定進程 PID。
選項:--forest#
以 ASCII 顯示進程與子進程的樹狀結構。
不同風格的進程集#
不同風格的選項進程集是不一樣的,但只要細心觀察,還是能發現一些規律。
ps
:不添加任何選項
ps -l
:Unix 風格,-l
表示以長格式顯示。
ps l
:BSD 風格,l
表示以 BSD 長格式顯示。
ps --forest
:GNU 風格,--forest
表示以進程樹的方式顯示。
上面的例子中,所用的選項都是和進程集無關的,可以總結出如下規律:
風格 | 進程集 |
---|
無選項 | 顯示所有與當前終端相關的進程 |
Unix | 與不添加選項一致 |
BSD | 顯示與當前用戶終端相關的所有進程 |
GNU | 與不添加選項一致 |
顯然,Unix 和 GNU 風格看上去更符合邏輯,因為它們的進程集和不添加選項時的進程集是一樣的,
但 BSD 風格就自己加戲了,把當前用戶其他終端相關的進程也包含進來了。
不同風格的選項可以一起使用,但如果兩個選項都是指定顯示格式,會無法執行。
另外,如果多個風格中包含了 BSD 風格,但選項中又沒有指定進程集,那麼默認會使用 BSD 的進程集。
常用功能#
列出用戶進程#
列出所有進程#
-e
顯示所有進程,-f
以全格式顯示,這沒什麼好說的。
奇怪的是 aux
的進程集,從上面的分析可以知道:
a
:顯示與終端相關的所有進程,不僅僅是當前終端或當前用戶。x
:顯示屬於當前用戶的所有進程。
顯然 ax
加起來也只是當前用戶的所有進程和不區分用戶的所有終端進程,但如果再看一下官方的文檔。
ax
一起用的時候代表所有進程,我們也可以驗證一下進程數。
可以看到 aux
和 -ef
的進程集數量是一樣的,我很細節的,我說的是數量🤪。
占用內存排名#
go rocks
特殊字段說明#
VSZ#
Virtual Memory Size,虛擬內存大小,以 KB 為單位。
Resident Set Size,常駐內存大小,以 KB 為單位。
TTY#
進程關聯的終端。如果進程與某個終端關聯,它會顯示終端的名稱;如果未關聯終端,則顯示 ?
。
STAT#
進程的狀態碼。常見的狀態碼包括:
R
: 運行中(Running)。S
: 睡眠中(Sleeping),等待某個事件完成。D
: 不可中斷的睡眠狀態(Uninterruptible Sleep),通常是等待 I/O。T
: 暫停或跟踪中(Stopped or Traced)。Z
: 僵尸進程(Zombie),進程已經終止,但未被父進程清理。I
: 空閒內核線程(Idle Kernel Thread)。Ss
: 主進程處於睡眠狀態。R+
: 運行中的進程,並且在前台顯示。
go rocks 需要深入理解不同的進程狀態
START#
進程啟動的時間或日期。對於新進程,顯示的是時間,對於舊進程,顯示的是日期。
TIME#
進程使用 CPU 的累計時間,表示該進程總共占用了多少 CPU 時間。
進程的 CPU 使用率。這個字段顯示的是自進程啟動以來,CPU 時間的累積使用百分比。