我想一个脚本/工具就好理解了C++,给了主bash脚本调用回溯(scitools):跟踪的bash调用
- 其他的bash脚本
- 的Python
- 的Java
- Perl
让我知道发生了什么。
我不需要复杂的图形,简单的文本文件是足够的。
什么让我可以做到这一点?
我想一个脚本/工具就好理解了C++,给了主bash脚本调用回溯(scitools):跟踪的bash调用
让我知道发生了什么。
我不需要复杂的图形,简单的文本文件是足够的。
什么让我可以做到这一点?
您可以使用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] ~]#
使用set -x
或运行使用bash -x
将打印每行的脚本,它的执行之前(但变量替换,它可以是有用的,但也可能是讨厌的,有时后):
bash -x myScript.sh
嗯,这并不完全是因为这是bash的打印输出。在多次调用(bash调用bash)的情况下,我必须手动执行。因为它是一个主脚本,打印出来的东西太多了;正如你所说(@Joachim)这是讨厌的。 – dlewin 2011-03-02 15:29:16
它应该是'set -x'而不是'+ x'。添加'-v'将打印该行而不扩展。 – 2011-03-02 17:49:31
@丹尼斯:谢谢,修正。我通常使用'bash -x'版本,所以我没有记错。 – 2011-03-02 17:51:40
如果你只是neeed的bash脚本通话记录,使用这个应用程序 https://github.com/lvitya/bash_wrapper
bash_wrapper替换庆典本身,日志谁叫bash_wrapper和exec原来的bash。这是它独立于-x
选项处理嵌套的bash调用。
您可以修改源代码以使用GraphViz的点格式获取调用图。
非常好,简单而有用。因此,我需要实现一个bash脚本来调用带有strace的主文件并将其传输到文件而不是stdout? – dlewin 2011-03-03 08:34:57
如果您始终需要跟踪(即使在生产中),您可以编写一个包装脚本来执行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