pstree 視覺化程序樹 文章首圖

pstree 視覺化程序樹

前言

在 Linux 系統管理與開發過程中,我們經常需要監控或調試程序的運行狀態。雖然 ps 指令能列出詳細的進程資訊,但當系統中同時運行著數百個進程時,扁平的列表往往讓人難以理清它們之間的父子關係(Parent-Child Relationship)。這時,pstree 指令便成了展現進程層次結構的利器。它能夠以樹狀圖的形式直觀地呈現進程的繼承關係,讓系統架構一目了然。本文将深入解析 pstree 的用法、選項與實際應用場景。

基本用法與預設輸出

pstree 指令通常包含在 psmisc 套件中。在 Ubuntu 或 Debian 系統上,若未安裝可透過以下指令安裝:

sudo apt update
sudo apt install psmisc

最基本的用法是直接執行 pstree,它會顯示當前用戶啟動的所有進程樹,並從 init 或 systemd 作為根節點開始展開。

pstree

輸出結果類似於以下結構(簡化版):

systemd───(sd-resolve)───{sd-resolve}
    ├── NetworkManager───{NetworkManager}
    ├── nginx───nginx───nginx───nginx───nginx
    │   └── nginx───nginx
    ├── sshd───sshd───bash───pstree
    └── Xorg───Xorg

從輸出中我們可以清楚看到,sshd 衍生出了另一個 sshd,而該進程又啟動了 bash,最後才是我們執行的 pstree。這種視覺化的連結對於理解程序 spawned(衍生)的路徑至關重要。

進階選項解析

為了滿足不同的調試需求,pstree 提供了多個實用的選項。

顯示進程 PID

預設情況下,pstree 僅顯示程序名稱。若需識別特定的進程 ID(PID),可以使用 -p 選項。這在需要發送訊號(如 kill)或進行進程追蹤時非常有用。

pstree -p

輸出範例:

systemd(1)─┬─NetworkManager(842)───{NetworkManager}(848)
           ├─nginx(1204)───nginx(1205)
           └─sshd(1300)───sshd(1450)───bash(1451)───pstree(2024)

注意括號內的數字即為 PID,這讓我們能精確定位到每一個節點。

依用戶過濾顯示

當系統服務繁多時,查看特定用戶(如 www-dataroot)的進程樹會更有針對性。使用 -u 選項並搭配用戶名,可以過濾出該用戶下的進程樹。

pstree -u www-data

若該用戶下有多個進程,輸出會顯示:

www-data───nginx───nginx───nginx

這有助於快速確認 Web 伺服器是否異常,或檢查是否有未授權的進程以該身份運行。

合併相同進程

當某個服務啟動了多個相同的子進程(例如 Nginx 的 worker processes)時,預設輸出會重複列出進程名稱,導致樹狀圖過長且難以閱讀。使用 -c 選項可以合併相同名稱的進程,使輸出更為精簡。

pstree -c

輸出範例:

systemd───nginx───[nginx]

這裡的 [nginx] 表示有多個同名的 nginx 進程被合併顯示,這在查看高負載伺服器時能大幅減少螢幕佔用空間。

顯示完整命令列

有時僅看進程名稱不足以區分功能相似的進程(例如多個 Python 腳本)。使用 -f 選項可以顯示完整的命令列參數。

pstree -f

輸出範例:

systemd
    └─nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
        └─nginx: worker process

常見問題與注意事項

1. pstree 無法顯示所有系統進程

預設情況下,pstree 只會顯示當前用戶啟動的進程樹,或是以 init/systemd 為根的整個系統樹(取決於版本與權限)。若你發現某些進程未顯示,請嘗試使用 sudo pstree 以提升權限,這樣可以看到整個系統的所有進程樹,而不僅限於當前使用者的子樹。

2. 樹狀符號在不同終端顯示異常

pstree 使用 Unicode 或 ASCII 字符來繪製連接線。在某些老舊的終端模擬器或編碼設定錯誤的環境中,可能會顯示為亂碼或方塊。若遇到此問題,可嘗試添加 -A(ASCII 模式)或 -L(直線模式)選項來強制使用標準 ASCII 字符繪製樹狀圖,確保在所有環境下都能正確閱讀。

小結

pstree 是一個輕量級但極具視覺效果的 Linux 指令。它不僅能幫助系統管理員快速掌握進程的層級結構,還能透過 -p-u-c 等選項靈活應對不同的調試場景。對於習慣使用 pstop 的使用者而言,偶爾切換到 pstree 的視角,往往能帶來意想不到的排查靈感。建議在日常維護中,將 pstree 納入你的工具包,特別是在分析服務依賴關係或排查異常進程時,它將是你不可或缺的得力助手。