ps (Process Status) 是 Linux 進程管理的基石命令。雖然 top/htop 提供實時視圖,但 ps 的靜態快照、豐富的格式化輸出、腳本友好特性,使其在自動化巡檢、CI/CD 流水線、容器健康檢查中不可替代。本文系統梳理 ps 的兩大語法流派、核心選項、實戰範例與避坑指南,助你從「會用」進階到「精通」。
| 風格 | 選項前綴 | 典型示例 | 備註 |
|---|---|---|---|
| BSD | 無連字符 | ps aux | a=所有終端 u=用戶導向輸出 x=無終端進程 |
| UNIX/Linux (標準) | 單破折號 | ps -ef | -e=所有進程 -f=全格式 |
⚠️ 致命陷阱: ps aux ≠ ps -aux!後者因 -a 解析錯誤會報錯或行為異常。建議統一使用 UNIX 風格 (ps -ef, ps -eo ...),跨平台兼容性最佳。
ps -ef # 標準全格式
ps aux # BSD 風格,輸出列略有不同 (USER vs UID)
ps -ef | less # 管道分頁查看
ps -f -u www-data,nginx # 多用戶逗號分隔
ps -U root -u root # 真實/有效用戶均為 root

ps -C nginx,apache2 # 精確匹配可執行文件名 (推薦)
ps -C nginx -f # 加 -f 顯示完整參數
優於 ps -ef | grep nginx (會匹配到 grep 自身、參數中的關鍵詞)。
# 顯示 PID、用戶、CPU%、內存%、命令,按 CPU 降序、內存升序
ps -eo pid,user,pcpu,pmem,comm --sort=-pcpu,+pmem
# 重命名列標題 (腳本解析友好)
ps -eo pid,user=USERNAME,pcpu=CPU_%,pmem=MEM_%,comm=COMMAND
# 取 Top 5 佔 CPU 進程
ps -eo pid,user,pcpu,pmem,comm --sort=-pcpu | head -6

ps -ef --forest
ps -f --forest -C nginx # 僅看 nginx 進程樹
# 輸出示例:
# UID PID PPID C STIME TTY TIME CMD
# root 1234 1 0 10:00 ? 00:00:00 nginx: master process
# www 1235 1234 0 10:00 ? 00:00:00 \_ nginx: worker process
# www 1236 1234 0 10:00 ? 00:00:00 \_ nginx: worker process

⚠️ 不要同時使用 --sort 和 --forest,排序會破壞樹結構順序。
# 先找到主進程 PID
ps -C nginx -o pid= # 僅輸出 PID,無標題
# 再查子進程
ps --ppid 1234 -o pid,user,comm
ps -p -L # 顯示指定 PID 的所有線程
ps -eLf # 所有進程的所有線程 (較大)
# 關鍵列:LWP (線程 ID)、NLWP (線程數)
| 格式碼 | 含義 | 示例 |
|---|---|---|
pid | 進程 ID | 1234 |
tid/lwp | 線程 ID | 1235 |
ppid | 父進程 ID | 1 |
user/euser | 有效/真實用戶名 | www-data |
uid/euid | 用戶 ID | 33 |
pcpu | CPU 使用率% | 2.3 |
pmem | 內存使用率% | 1.2 |
vsz/rss | 虛擬/常駐內存 (KB) | 123456 / 23456 |
stat/state | 進程狀態碼 | Ss, R+, Sl |
etime/etimes | 運行時間 [[DD-]hh:]mm:ss / 秒數 | 02:15:30 |
comm/cmd/args | 命令名/完整命令行/帶參數 | nginx / nginx: master process / nginx -g 'daemon off;' |
cgroup | 控制組路徑 (systemd 切片) | /system.slice/nginx.service |
# 1. 找出 CPU > 50% 的進程,輸出 PID 命令 CPU 內存
ps -eo pid,pcpu,pmem,comm --sort=-pcpu | awk '$2>50 {print}'
# 2. 檢查殭屍進程
ps -eo stat,pid,ppid,comm | awk '$1 ~ /^Z/ {print}'
# 3. 統計每用戶進程數
ps -eo user= | sort | uniq -c | sort -rn
# 4. 容器環境:按 cgroup 統計進程數
ps -eo cgroup= | grep -v '^$' | sort | uniq -c | sort -rn
ps 顯示 UID。用 -o user=USERNAME 強制顯示完整名,或用 ps -eo euser (有效用戶名不截斷)。cmd/args 含空格導致列對齊困難,腳本解析建議用 comm (僅命令名) 或指定分隔符 ps -eo pid:1=,comm:20=。ps -eLf 會重複顯示進程信息,統計進程數用 ps -eo pid= | wc -l,統計線程數用 ps -eLf | wc -l。ps 只能看,清理需向父進程發 SIGCHLD 或重啟父進程。ps 的威力在於 「精準快照 + 任意格式化 + 腳本集成」。掌握 -eo 自定義列、--sort 排序、--forest 樹狀、-C 名稱過濾、-L 線程、--ppid 父子關係這六大核心技能,即可應對 99% 的進程檢視與自動化巡檢場景。下次寫巡檢腳本時,拋棄 grep,擁抱 ps -eo 的結構化輸出吧!