2015-08-18 156 views
1

假設我們有三個叫做A1,A2和A3的shell腳本。 A1將調用A2,A2將調用A3。如何列出shell scipt的層次結構/樹結構?

有什麼命令可以列出它們的樹形結構嗎?說shelltree

shelltree A1 

結果想:

A1 
|---A2 
     |---A3 
+0

運行此腳本後,所調用的命令將作爲進程樹顯示(假設它們通過普通的fork + exec調用,而不是'source'或'exec'而沒有fork。) – kojiro

+1

'strace -f -e trace = execve bash A1'可能是一個起點 - 你必須對輸出進行後處理以得到你想要的結果...... – twalberg

回答

1

您可以使用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 
+0

如果程序運行很長時間或者沒有正確完成,該怎麼辦?窗臺列出完整的樹? –

+0

@KenT只要有一個進程正在運行,就會得到樹。如果你想保留以前正在運行的進程的樹,你需要在程序退出之前將它存儲在某處(如進入變量)。 – kenorb

+0

看來,如果A依次產生B,C和D. pstree只能列出A-B,A-C或A-D的樹。我怎樣才能列出他們呢? –