本篇介紹如何在 Linux 中使用 pstree 指令,以樹狀圖的方式顯示系統各行程之間的相關性。

在管理 Linux 系統時,有時候會需要釐清多個行程(processes)之間的關係,這時候就可以使用 pstree 這個指令,以樹狀圖來呈現多個行程的關係圖。


我自己最常遇到的問題就是在用多條 SSH 登入主機後,其中有一條 SSH 的網路斷了,想要把斷線的 SSH 相關的行程砍掉(kill),但是因為系統上的 SSH 登入行程有很多個,不是很容易判斷斷線 SSH 連線的 PID,若要確認正確的 PID,最方便的方式就是使用 pstree 來檢查。

pstree 指令基本用法

直接執行 pstree 不加任何參數的話,就會以樹狀圖顯示整個系統上每個行程之間的從屬關係:

pstree

pstree 樹狀圖

pstree 的輸出預設會將相同名稱的行程合併成一個節點來顯示,例如:

init-+-getty
     |-getty
     |-getty
     `-getty

合併之後,就會變成:

init---4*[getty]

另外大括號則是代表子執行緒的意思。

顯示指令參數

如果要顯示每個行程指令的完整參數,可以加上 -a 參數:

pstree -a

顯示指令參數

顯示行程 ID(PID)

若要顯示每個行程的 ID(PID),可以加上 -p 參數:

pstree -p

顯示行程 ID(PID)

加上 -p 參數之後,在輸出時就不會將相同名稱的行程合併了,所以輸出的樹狀圖看起來會比較長。

以 PID 排序

pstree 的輸出預設會以行程的名稱來排序,若要以 PID 來排序,可以加上 -n 參數,而通常在這種狀況下,我們也會同時加上 -p 參數,顯示行程的 PID:

pstree -np

以 PID 排序

顯示特定使用者行程

若只想看某個特定使用者所執行的程式時,可以在 pstree 的參數中直接指定使用者的帳號名稱,這樣就會只顯示屬於該使用者的行程:

pstree gtwang

顯示特定使用者行程

顯示特定 PID 行程

如果想要查看特定 PID 的行程,也可以在 pstree 的參數中指定 PID,這樣就會以該行程為起始點,顯示以下的行程樹狀圖,而通常在這種狀況下,我們也會同時加上 -p 參數,顯示行程的 PID:

pstree -p 2468

顯示特定 PID 行程

而如果想要查看該行程上面的父行程,可以再加上一個 -s 參數:

pstree -ps 2468

顯示特定 PID 行程的父行程

標示改變 UID 的行程

在大部分的狀況下,一個行程在建立子行程的時候,會維持相同的使用者 ID(UID),而在某些時候子行程的 UID 會改變,若想要在 pstree 的輸出中標示出改變 UID 的行程,可以加上 -u 參數。

pstree -u

標示改變 UID 的行程

加上 -u 參數之後,若遇到有變更 UID 的行程,就會以小括號標示新的使用者帳號名稱,例如 upstart(gtwang) 就是代表該行程的使用者變更為 gtwang。若沒有標示的行程,則代表沿用父行程的 UID。

標示特定行程

若要在 pstree 的輸出中,以高亮度標示指定的行程,可以使用 -H 參數,並加上行程的 PID:

pstree -pH 1663

標示特定行程

參考資料:HowtoForge鳥哥的 Linux 私房菜