【发布时间】: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()。