跟踪bash调用

2 投票
3 回答
539 浏览
提问于 2025-04-16 12:50

我想要一个像理解C++的工具(scitools),可以给我的主bash脚本提供回溯信息,这个主bash脚本会调用:

  • 其他bash脚本
  • Python脚本
  • Java程序
  • Perl脚本

这样我就能知道发生了什么。

我不需要复杂的图表,简单的文本文件就够了。

有什么工具可以帮我实现这个呢?

3 个回答

0

如果你只是需要一个能记录 bash 脚本调用日志的工具,可以使用这个应用:https://github.com/lvitya/bash_wrapper

这个 bash_wrapper 替代了原来的 bash,能够记录是谁调用了 bash_wrapper,然后再执行原来的 bash。也就是说,它可以独立处理嵌套的 bash 调用,而不受 -x 选项的影响。

你还可以修改源代码,使用 GraphViz 的 dot 格式来生成调用图。

6

使用 set -x 或者用 bash -x 来运行脚本,会在每一行执行之前打印出来(不过是在变量替换之后,这样做有时候很有用,但有时候也会让人感到困惑):

bash -x myScript.sh
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 ~]# 

撰写回答