2012年1月4日 星期三

透過 /proc/PID/task/ 觀察 multi-thread 狀態

為了搞清楚程式、用到的函式庫等到底有沒有用到 multi-thread, 以及各 thread 的狀態如何變化等, 查了一下相關資訊。

man ps 裡沒看到適合的參數, ps -eLf 沒有列出 thread 的執行狀態。這頁 man page 太複雜, 看一看決定改看 man proc, 反正 ps 也是讀 /proc/PID 的資訊。

順著 "thread" 的關鍵字掃完 man proc, 看到 /proc/PID/task/ 有記錄擁有的 thread 資訊, 其中每一個目錄 /proc/PID/task/TID/有類似 /proc/PID/ 的資訊, 而 /proc/PID/task/TID/status 裡面有我要的東西。所以就寫了個小程式 thstate 來觀察行為, 試用後頗順利地達成階段性目標。/proc 真是好東西, 為啥以前都沒留意到呢 ...。

2012/01/05 更新

看到 wens 提到可混用 ps aux -L, 這樣就有 LWP (thread id) 了, 不過沒有 PPID。又查了一下 man page, 發現可用 -o 自訂格式, 這樣用

ps awxo pid,ppid,pgid,nlwp,lwp,stat,comm

就有符合我需求的材料了, 再配合 grep PID 即可。不過既然已寫好了客製化的 script, 還是用 script 比較順手一些。

2012/01/05 再更新

看到 Scott 提到可用 ps u -Lp PID, 終於湊出「終極」指令。上面的描述就當記錄吧, 也反映出軟體開發的常態, 工程師常常找不到想要的東西就開始自己重造輪子, 造好後才發現原來其實有更好的方案, 只是之前沒有看到 ...。

ps -Lo pid,ppid,pgid,nlwp,lwp,stat,command -p PID

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...