2015-08-18 158 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的树。我怎样才能列出他们呢? –