萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux ps 命令實戰大全:從基礎語法到進階過濾排序與樹狀分析

ps (Process Status) 是 Linux 進程管理的基石命令。雖然 top/htop 提供實時視圖,但 ps 的靜態快照、豐富的格式化輸出、腳本友好特性,使其在自動化巡檢、CI/CD 流水線、容器健康檢查中不可替代。本文系統梳理 ps 的兩大語法流派、核心選項、實戰範例與避坑指南,助你從「會用」進階到「精通」。

兩大語法流派:別再混淆

風格選項前綴典型示例備註
BSD無連字符ps auxa=所有終端 u=用戶導向輸出 x=無終端進程
UNIX/Linux (標準)單破折號ps -ef-e=所有進程 -f=全格式

⚠️ 致命陷阱: ps aux ≠ ps -aux!後者因 -a 解析錯誤會報錯或行為異常。建議統一使用 UNIX 風格 (ps -ef, ps -eo ...),跨平台兼容性最佳。

核心實戰範例速查表

1. 列出所有進程 (含無終端)

ps -ef              # 標準全格式
ps aux              # BSD 風格,輸出列略有不同 (USER vs UID)
ps -ef | less       # 管道分頁查看

2. 按用戶過濾

ps -f -u www-data,nginx    # 多用戶逗號分隔
ps -U root -u root         # 真實/有效用戶均為 root

ps 按用戶過濾示例

3. 按進程名/命令名搜索

ps -C nginx,apache2        # 精確匹配可執行文件名 (推薦)
ps -C nginx -f             # 加 -f 顯示完整參數

優於 ps -ef | grep nginx (會匹配到 grep 自身、參數中的關鍵詞)。

4. 自定義輸出列與排序 — 自動化腳本必備

# 顯示 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 自定義輸出排序示例

5. 樹狀視圖:父子進程關係一目了然

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

ps --forest 樹狀輸出

⚠️ 不要同時使用 --sort 和 --forest,排序會破壞樹結構順序。

6. 查看指定父進程的所有子進程

# 先找到主進程 PID
ps -C nginx -o pid=   # 僅輸出 PID,無標題
# 再查子進程
ps --ppid 1234 -o pid,user,comm

7. 顯示進程線程 (LWP)

ps -p  -L         # 顯示指定 PID 的所有線程
ps -eLf                # 所有進程的所有線程 (較大)
# 關鍵列:LWP (線程 ID)、NLWP (線程數)

8. 格式化輸出大全 (man ps / Standard Format Specifiers)

格式碼含義示例
pid進程 ID1234
tid/lwp線程 ID1235
ppid父進程 ID1
user/euser有效/真實用戶名www-data
uid/euid用戶 ID33
pcpuCPU 使用率%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

避坑指南

  1. 用戶名截斷: 用戶名 > 8 字符時 ps 顯示 UID。用 -o user=USERNAME 強制顯示完整名,或用 ps -eo euser (有效用戶名不截斷)。
  2. 參數含空格: cmd/args 含空格導致列對齊困難,腳本解析建議用 comm (僅命令名) 或指定分隔符 ps -eo pid:1=,comm:20=。
  3. 線程 vs 進程: ps -eLf 會重複顯示進程信息,統計進程數用 ps -eo pid= | wc -l,統計線程數用 ps -eLf | wc -l。
  4. 僵屍進程清理: ps 只能看,清理需向父進程發 SIGCHLD 或重啟父進程。

總結

ps 的威力在於 「精準快照 + 任意格式化 + 腳本集成」。掌握 -eo 自定義列、--sort 排序、--forest 樹狀、-C 名稱過濾、-L 線程、--ppid 父子關係這六大核心技能,即可應對 99% 的進程檢視與自動化巡檢場景。下次寫巡檢腳本時,拋棄 grep,擁抱 ps -eo 的結構化輸出吧!

copyright © 萬盛學電腦網 all rights reserved