2011-03-02 65 views
2

我想一个脚本/工具就好理解了C++,给了主bash脚本调用回溯(scitools):跟踪的bash调用

  • 其他的bash脚本
  • 的Python
  • 的Java
  • Perl

让我知道发生了什么。

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

什么让我可以做到这一点?

回答

3

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

您将不得不运行您的脚本,如:strace -q -f -e execve yourscript.sh

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

[[email protected] ~]# ./x.sh 
x 
y 
z 
[[email protected] ~]# cat x.sh 
#!/bin/bash 
echo x 
./y.sh 

[[email protected] ~]# cat y.sh 
#!/bin/bash 

echo y 
./z.sh 
[[email protected] ~]# cat z.sh 
#!/bin/bash 

echo z 

[[email protected] ~]# 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或其他可执行文件的调用。

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

echo y 
perl -e 'print "z\n";' 
[[email protected] ~]# ./x.sh 
x 
y 
z 
[[email protected] ~]# 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) --- 
[[email protected] ~]# 
+0

非常好,简单而有用。因此,我需要实现一个bash脚本来调用带有strace的主文件并将其传输到文件而不是stdout? – dlewin 2011-03-03 08:34:57

+0

如果您始终需要跟踪(即使在生产中),您可以编写一个包装脚本来执行strace并仅捕获日志文件中的stderr(strace -q -f -e execve ./x.sh 2>/var/log /x.trace)。这样你就可以在标准输出上获得正常输出,并在/var/log/x.trace中获得跟踪。唯一的问题是,如果你的脚本写入stderr,那么也会以x.trace结束。 – 2011-03-03 13:12:39

6

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

bash -x myScript.sh 
+0

嗯,这并不完全是因为这是bash的打印输出。在多次调用(bash调用bash)的情况下,我必须手动执行。因为它是一个主脚本,打印出来的东西太多了;正如你所说(@Joachim)这是讨厌的。 – dlewin 2011-03-02 15:29:16

+0

它应该是'set -x'而不是'+ x'。添加'-v'将打印该行而不扩展。 – 2011-03-02 17:49:31

+0

@丹尼斯:谢谢,修正。我通常使用'bash -x'版本,所以我没有记错。 – 2011-03-02 17:51:40

0

如果你只是neeed的bash脚本通话记录,使用这个应用程序 https://github.com/lvitya/bash_wrapper

bash_wrapper替换庆典本身,日志谁叫bash_wrapper和exec原来的bash。这是它独立于-x选项处理嵌套的bash调用。

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