假设我们有三个叫做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