我有一个进程,它创建了许多子进程。每个子进程可能会创建更多的子进程。如何获取所有已创建进程的命令行参数列表?最好还要知道每个子进程的父进程。
所以我需要获取每个进程的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。但是,它将更难解析,因为需要过滤日志以仅包含我们感兴趣的进程树信息。
所以我需要获取每个进程的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。但是,它将更难解析,因为需要过滤日志以仅包含我们感兴趣的进程树信息。
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