假設我們有三個叫做A1,A2和A3的shell腳本。 A1將調用A2,A2將調用A3。如何列出shell scipt的層次結構/樹結構?
有什麼命令可以列出它們的樹形結構嗎?說shelltree
shelltree A1
結果想:
A1
|---A2
|---A3
假設我們有三個叫做A1,A2和A3的shell腳本。 A1將調用A2,A2將調用A3。如何列出shell scipt的層次結構/樹結構?
有什麼命令可以列出它們的樹形結構嗎?說shelltree
shelltree A1
結果想:
A1
|---A2
|---A3
您可以使用pstree
這表明正在運行的進程的一棵樹。
例如:
$ bash -c '(bash -c "sleep 20"); sleep 20' &
[1] 23863
$ pstree $(pgrep -fn bash)
-+= 23863 user bash -c (bash -c "sleep 20"); sleep 20
\--- 23864 user sleep 20
用法:
pstree -p [pid ...]
或者更復雜的例子(基於this):
#!/bin/bash
d=$1
f(){ let d--; if [ $d -gt 0 ]; then bash -x $0 $d $$; else [ $d -eq 0 ] && pstree -p $$; fi }; f
輸出:
$ bash foo.sh 5
+ pstree -p 76216
-+= 00001 root /sbin/launchd
\-+= 00231 kenorb /sbin/launchd
\-+= 00246 kenorb /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn_0_49164
\-+= 70321 root login -pfl kenorb /bin/bash -c exec -la bash /usr/local/bin/bash
\-+= 70322 kenorb -bash
\-+= 76212 kenorb bash foo.sh 5
\-+- 76213 kenorb bash -x foo.sh 4 76212
\-+- 76214 kenorb bash -x foo.sh 3 76213
\-+- 76215 kenorb bash -x foo.sh 2 76214
\-+- 76216 kenorb bash -x foo.sh 1 76215
\-+- 76217 kenorb pstree -p 76216
\--- 76218 root ps -axwwo user,pid,ppid,pgid,command
如果程序運行很長時間或者沒有正確完成,該怎麼辦?窗臺列出完整的樹? –
@KenT只要有一個進程正在運行,就會得到樹。如果你想保留以前正在運行的進程的樹,你需要在程序退出之前將它存儲在某處(如進入變量)。 – kenorb
看來,如果A依次產生B,C和D. pstree只能列出A-B,A-C或A-D的樹。我怎樣才能列出他們呢? –
運行此腳本後,所調用的命令將作爲進程樹顯示(假設它們通過普通的fork + exec調用,而不是'source'或'exec'而沒有fork。) – kojiro
'strace -f -e trace = execve bash A1'可能是一個起點 - 你必須對輸出進行後處理以得到你想要的結果...... – twalberg