跟踪bash调用

时间:2011-03-02 14:37:59

标签: python linux bash scripting

我想要一个类似于理解C ++(scitools)的脚本/工具,它们为调用的主bash脚本提供回溯:

  • 其他bash脚本
  • 的Python
  • 爪哇
  • 的Perl

让我知道发生了什么。

我不需要复杂的图形,简单的文本文件是足够的。

什么可以让我这样做?

3 个答案:

答案 0 :(得分:6)

使用set -x或使用bash -x运行脚本将在执行之前打印每一行(但在变量替换之后,这可能很有用,但有时也可能很讨厌):

bash -x myScript.sh

答案 1 :(得分:3)

您可以使用 strace 来跟踪脚本执行其他脚本或程序。

你必须运行你的脚本,如: strace -q -f -e execve yourscript.sh

这将跟踪对其他可执行文件的所有调用。

[root@devel ~]# ./x.sh 
x
y
z
[root@devel ~]# cat x.sh 
#!/bin/bash
echo x
./y.sh

[root@devel ~]# cat y.sh 
#!/bin/bash

echo y
./z.sh
[root@devel ~]# cat z.sh 
#!/bin/bash

echo z

[root@devel ~]# strace -q -f -e execve ./x.sh 
execve("./x.sh", ["./x.sh"], [/* 28 vars */]) = 0
x
[pid 19781] execve("./y.sh", ["./y.sh"], [/* 28 vars */]) = 0
y
[pid 19782] execve("./z.sh", ["./z.sh"], [/* 28 vars */]) = 0
z
[pid 19781] --- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) —

它甚至可以跟踪对perl或其他可执行文件的调用。

[root@devel ~]# cat x.sh 
#!/bin/bash
echo x
./y.sh
ls >/dev/null 2>&1
[root@devel ~]# cat y.sh 
#!/bin/bash

echo y
perl -e 'print "z\n";'
[root@devel ~]# ./x.sh 
x
y
z
[root@devel ~]# strace -q -f -e execve ./x.sh 
execve("./x.sh", ["./x.sh"], [/* 28 vars */]) = 0
x
[pid 20300] execve("./y.sh", ["./y.sh"], [/* 28 vars */]) = 0
y
[pid 20301] execve("/usr/bin/perl", ["perl", "-e", "print \"z\\n\";"], [/* 28 vars */]) = 0
z
[pid 20300] --- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) ---
[pid 20302] execve("/bin/ls", ["ls"], [/* 28 vars */]) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
[root@devel ~]# 

答案 2 :(得分:0)

如果您只是需要bash脚本调用日志,请使用此应用程序 https://github.com/lvitya/bash_wrapper

bash_wrapper替换bash本身,调用bash_wrapper并执行原始bash的日志。也就是说,它独立于-x选项处理嵌套的bash调用。

您可以使用GraphViz的点阵格式修改源代码以获取调用图。