gpt4 book ai didi

python - 如何在 Linux 中跟踪所有后代进程

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:19 25 4
gpt4 key购买 nike

我正在制作一个需要生成多个进程的库。

我希望能够知道在测试期间产生的所有后代进程的集合。这对于在通过的测试结束时终止行为良好的守护程序或通过获取失败测试后存在的任何进程的堆栈跟踪来调试死锁/挂起进程很有用。

由于其中一些需要产生守护进程(fork,fork,然后让父进程死掉),我们无法通过遍历进程树来找到所有进程。

目前我的做法是:

  1. 使用 os.register_at_fork 注册处理程序
  2. 在 fork 上,在 child 中,flock 一个文件并将 (pid, process start time) 附加到另一个文件中
  3. 然后在需要时,我们可以通过遍历文件中的条目并保留(pid,进程开始时间)与现有进程匹配的条目来获取子进程集

这种方法的缺点是:

  1. 仅适用于 multiprocessingos.fork - 在使用 subprocess 或非 Python 进程生成新的 Python 进程时不起作用.
  2. 锁定 fork 可能会使测试期间的事情比实际情况更具确定性,从而隐藏竞争条件。

我正在寻找一种不同的方式来跟踪子进程,以避免这两个缺点。

我考虑过的备选方案:

  1. 使用bcc注册 fork/clone 的探针——问题是它需要 root,我认为从贡献者的角度来看,这对于运行测试来说有点烦人。作为非特权用户,是否可以仅针对当前进程和后代执行类似的操作?
  2. 使用与上述类似的 strace(或 ptrace)——问题在于性能影响。其中有几个测试是专门对启动时间进行基准测试的,ptrace 的开销比较大。如果只跟踪 fork 和 clone 可能会不那么重要,但它仍然与在测试超时时获取堆栈的愿望相冲突。

有人可以建议解决这个问题的方法,避免上述问题的陷阱和缺点吗?我现在只对 Linux 感兴趣,理想情况下它不需要 4.15 之后的内核。

最佳答案

对于 subprocess.Popen,有一个可调用的 preexec_fn 参数——您可以破解它。

或者,看看 cgroups (控制组)——我相信他们可以处理棘手的情况,例如守护进程创建等等。

关于python - 如何在 Linux 中跟踪所有后代进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56030923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com