在Linux(或POSIX系统)中,我需要追踪由给定进程创建的所有子进程。

4
我有一个进程,它创建了许多子进程。每个子进程可能会创建更多的子进程。如何获取所有已创建进程的命令行参数列表?最好还要知道每个子进程的父进程。
所以我需要获取每个进程的pid、ppid和commandline。然后我可以分析这些数据。
在Windows中,我可以使用像ProcessMonitor这样的工具来收集这些数据(该工具钩取系统调用,如CreateProcess)。我想在Linux中也存在类似的机制?
编辑:那么在Linux中有两种方法:
1. 使用"exec strace -s 9999 -f -e trace=execve -p [pid of process] >& strace.log"命令。然后使用一些简单的perl脚本解析它并生成一个子进程树。我最终采用了这种方式。缺点是strace调试整个进程树,有些程序因此失败。
2. 使用auditctl。它直接记录特定的系统调用,而不进行调试。类似于Windows的Process Monitor工具。我没有尝试过它。可能可以解析日志以生成子进程树,类似于strace。但是,它将更难解析,因为需要过滤日志以仅包含我们感兴趣的进程树信息。

我写了一篇文章在这里比较不同的选项。链接 - Natan Yellin
strace会在execve时fork一些信息,但是例如:5:execve("/usr/libexec/baloo_file_extractor", ["/usr/libexec/baloo_file_extracto"...],你可以看到它省略了大部分的参数!此外,并非所有的子进程(线程?)都是通过execve创建的;在我的情况下,守护程序使用clone()创建了一些进程,但从未使用execve()。我认为这些没有命令行。如果strace --follow-forks或更好的跟踪工具有一个选项来打印“由父进程45304克隆的线程45306”或“由父进程45306使用命令行“...”执行的进程45887”,那将是很棒的。 - skierpage
1个回答

2

如果您想在某个特定时间获取信息,这并不是那么简单,您可能需要查看以下问题的答案以了解其他需要考虑的事项:

在我看来,在特定时刻获得各种进程信息的最简单方法是从/proc/<pid>目录下的文件中获取,参见http://man7.org/linux/man-pages/man5/proc.5.html

如果您需要整个进程的(历史)信息,strace可以捕获其中一部分(但它可能会影响性能,不确定是否适用于您):https://superuser.com/questions/79869/will-strace-watch-system-calls-recursively-on-child-processes-of-the-main-proces


我需要整个进程树的数据。我查看了strace(1)的手册页,似乎这个工具可以完成我的任务。能否配置strace(1)以递归地跟踪所有子进程的execve(2)系统调用并将数据记录到某个文件中?对于每个被跟踪的调用,我需要pid、ppid和调用参数(命令行)。最好忽略其他系统调用,否则会对性能产生巨大影响... - my_stk_oflw_account
我相信 strace -f -e execve <program cmdline> >& path/logfile 应该接近你所需要的。它不能直接给你 ppid,你需要计算它。 - Dan Cornilescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接