【问题标题】:tracking bash calls跟踪 bash 调用
【发布时间】:2011-07-07 08:12:49
【问题描述】:

我想要一个脚本/工具,例如了解 C++(scitools),它为调用的主 bash 脚本提供回溯:

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

让我知道发生了什么。

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

什么能让我这样做?

【问题讨论】:

    标签: python linux bash scripting


    【解决方案1】:

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

    bash -x myScript.sh
    

    【讨论】:

    • 这不完全是因为这是 bash 的打印输出。如果有多个调用(bash call bash),我必须手动进行。因为是母版,打印出来的东西太多了;正如你所说(@Joachim),这很糟糕。
    • 应该是set -x 而不是+x。添加-v 将打印没有扩展的行。
    • @Dennis:谢谢,已修复。我一般用bash -x的版本,所以没记错。
    • +x 在任何一种情况下都会关闭xtrace
    【解决方案2】:

    您可以使用 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 ~]# 
    

    【讨论】:

    • 非常好,简单实用。因此,我需要实现一个 bash 脚本来使用 strace 调用主脚本并将其通过管道传输到文件而不是 stdout ?
    • 如果您总是需要跟踪(即使在生产中),您可以编写一个包装脚本来执行 strace 并仅在日志文件中捕获 stderr (strace -q -f -e execve ./x. sh 2>/var/log/x.trace)。这样,您将在标准输出上获得正常输出,并在 /var/log/x.trace 中获得跟踪。唯一的问题是,如果您的脚本写入 stderr,那也将在 x.trace 中结束。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 2013-10-05
      • 2011-09-06
      • 2010-10-15
      • 2012-04-03
      • 2022-01-23
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      相关资源
      最近更新 更多