【问题标题】:I need to trace all child processes created by given process in Linux (or POSIX system)我需要跟踪Linux(或POSIX系统)中给定进程创建的所有子进程
【发布时间】:2015-09-26 16:50:07
【问题描述】:

我有创建许多子进程的进程。并且每个子进程都可以创建后续的子进程。 如何获取所有已创建进程及其命令行参数的列表? 而且我最好需要知道每个子进程的父进程。

所以我需要为每个进程获取 pid、ppid 和命令行。然后我可以分析这些数据。

在 Windows 中,我可以使用 ProcessMonitor 之类的工具(它与 CreateProcess 之类的系统调用挂钩)收集这些数据。 我想Linux中是否存在类似的机制?

编辑: 所以在Linux中有两种方式:

  • 使用exec strace -s 9999 -f -e trace=execve -p [pid of process] >& strace.log。然后用一些简单的 perl 脚本解析它并生成一个子进程树。我最终使用了它。缺点是 strace 调试所有进程树。一些程序因此而失败。
  • 使用auditctl。它直接记录特定的系统调用,无需调试。类似于 Windows 中的 Process Monitor 工具。我没试过。可能会解析日志以生成子进程树,类似于 strace。不过,解析起来会更加困难,因为需要过滤日志以仅包含我们感兴趣的进程树中的信息。

【问题讨论】:

  • strace 派生出execve 获取一些信息,但例如``` 5:execve("/usr/libexec/baloo_file_extractor", ["/usr/libexec/baloo_file_extracto"...], ``` 你可以看到它省略了大部分参数!另外,不是所有的子进程(线程?)是execve;在我的例子中,守护进程用clone()创建了一些,但从来没有execve()。我认为那些没有命令行。如果strace --follow-forks`或者更好的跟踪工具可以选择打印“父 45304 的线程 45306 clone()d”或使用命令行“....”的父 45306 处理 45887 execve()。

标签: linux unix posix


【解决方案1】:

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

恕我直言,在某个时刻获取各种进程信息的最简单方法是从/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 和调用参数(命令行)。其他系统调用最好忽略,否则会有巨大的性能损失...
  • 我相信 strace -f -e execve <program cmdline> >& path/logfile 会接近您正在寻找的内容。不会直接给你 ppid,你需要计算那个。
猜你喜欢
  • 2010-11-02
  • 2012-11-11
  • 1970-01-01
  • 2010-12-24
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多