2012-07-26 25 views

回答

1

您可以輕鬆地識別子進程,例如,使用像pstree工具(這是使人類可讀的輸出非標準程序)。

~ $ pstree -ps "$PPID" 
init(1)───tmux(9707)─┬─bash(9708)─┬─bash(9742)───trayer(9743) 
        │   └─weechat-curses(10594) 
        ├─bash(10729)───su(10746)───bash(10752)───vim(10761) 
        ├─bash(10818)───ksh(1748) 
        ├─bash(15133)───pstree(15474) 
        ├─bash(17879)───man(15076)───sh(15079)───sh(15080)───vimmanpager(15084)───vim(15088) 
        ├─bash(17900)───su(17917)───bash(17922) 
        ├─bash(20076)───man(20095)───sh(20098)───sh(20099)───vimmanpager(20103)───vim(20109) 
        ├─bash(20116)───man(20135)───sh(20138)───sh(20139)───vimmanpager(20143)───vim(20147) 
        └─tmux-mem-cpu-lo(15472) 

如果需要的原始數據,至少在Linux下,你可以通過/proc/<pid>/stat遞歸爬行。您也可以使用ps,但解析其輸出並不是我喜歡做的事情。

但是你的問題是「你能識別由shell創建的所有進程嗎?」。技術上,不。如果您使用disown或使用nohup運行,並且尤其是在父進程死亡的情況下,則子進程可能成爲init的子進程,並且與另一個進程分叉的進程無法區分。

這種情況下的解決方案是特定於平臺的。如果你已經在內核中建立了支持,你可以在Linux下使用cgroups。我相信BSD的等價物被稱爲「監獄」。

此外,如果您嘗試將跟蹤進程作爲腳本的一部分,而不是開發和測試以外的原因,則應該使用正確的process management。不應該在腳本中使用ps

+2

on unix(SunOS)你可以使用ptree – 2012-07-26 07:30:21

+0

你的腳本在做什麼?如果它沒有長時間運行或在後臺運行,那麼你不能在ps命令輸出中看到它們,因爲它只會運行並退出進程。 – Satish 2012-08-23 20:43:36