【问题标题】:How to get a process tree trace/log of a process in linux?如何在linux中获取进程的进程树跟踪/日志?
【发布时间】:2010-10-14 23:03:15
【问题描述】:

我想知道脚本启动了哪些可执行文件以及以什么顺序启动(并递归跟踪这些可执行文件)。

例如,假设我在这里有一个 bash 脚本(称为 abc.sh):

#!/bin/bash
ls
gcc

我想用“trace/log 命令”运行这个脚本并得到类似这样的东西:

abc.sh -- ls
      |-- gcc -- cpp
              -- cc1
              ... etc.

这表明abc.sh 调用了ls 和gcc。 gcc 依次调用 cpp 和 cc1。

这可能吗?我该怎么做?像上面这样的树视图会很好,但更简单的视图也可以。

请注意,我不想要进程树的当前快照。相反,我想要生成过程的跟踪或日志。时间标注也很有用。

谢谢!

【问题讨论】:

    标签: linux ps strace


    【解决方案1】:

    您可以尝试分析strace 命令的输出。 特别是,你会对类似的东西感兴趣

    strace -f -tt -e trace=execve ./abc.sh
    

    【讨论】:

    • 您可能想要添加一些输出重定向和一个 grep,以便您只获得输出的 exec 部分。特别是如果您正在跟踪的脚本有输出: strace -f -e trace=execve ./t.sh 2>&1 | grep 执行
    • 这个,我想这会起作用。我希望有一些更高级别的脚本/工具可以执行以下操作: 1. 如果除了 execve 之外还有其他命令可以生成子进程,那么也捕获这些命令。 2. 以漂亮的树形呈现。 3.不打印不成功的 execve 命令(通常它会遍历整个 PATH 以查看 exe 是否存在)。
    • @Paul:我宁愿使用 -o 选项将 strace 输出重定向到文件。因为没有什么能阻止程序将包含“exec”的内容打印到标准错误,对吧?
    • @madiyaan:您可能还想跟踪导致创建新进程的 fork/vfork/clone 调用,但实际上 execve 是一个导致执行新程序的信号系统调用。跨度>
    【解决方案2】:

    您可以使用 pstree 命令。它旨在准确显示您正在寻找的内容:进程树(因此名称为 pstree)。它不会为您提供进程跟踪,但您可以多次调用它以获得与您正在寻找的类似的东西。

    【讨论】:

    • 如果进程产生并很快退出怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多