linux - 我需要跟踪 Linux(或 POSIX 系统)中给定进程创建的所有子进程

标签 linux unix posix

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

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

在 Windows 中,我可以使用像 ProcessMonitor 这样的工具收集这些数据(它 Hook 像 CreateProcess 这样的系统调用)。 我想在 Linux 中也存在类似的机制吧?

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

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

最佳答案

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

恕我直言,在特定时刻获取各种进程信息的最简单方法是从 /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

关于linux - 我需要跟踪 Linux(或 POSIX 系统)中给定进程创建的所有子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31298392/

相关文章:

multithreading - POSIX pthread 互斥锁和解锁中线程的等待队列在哪里?

linux - 在 EC2 linux 实例启动时启动程序

linux - 如何让 Linux 运行一个外国程序(几乎)就像本地程序一样

linux - 如何从远程 SSH session 将数据发送到本地剪贴板

bash - 使用 awk 在字符串中查找值

unix - 如何在 RHEL 5 中修改非交互式 SSH 调用的路径?

java - Java线程和操作系统线程的区别?

c - 如何在 C 中使用 nanosleep()?什么是 `tim.tv_sec` 和 `tim.tv_nsec` ?

linux - 判断socket上是否还有Data残留并丢弃

sockets - Unix 域套接字队列详细信息