You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中如何获取进程的所有后代进程(包括已结束进程)

获取进程A的所有后代进程(含已结束进程)

问题根源

进程B结束后,它启动的子进程会被系统的init(PID 1)或systemd接管,脱离进程A的父级关联,所以pgrep -P/ps --ppid这类基于当前进程父PID的工具无法找到关联;而已结束的进程会从/proc目录中移除,常规工具无法直接查询。

解决方案

1. 事前用strace追踪所有进程创建行为

在启动进程A时,用strace监控它及所有子进程的创建、执行操作,全程记录到日志文件:

strace -f -e trace=fork,vfork,execve -o a_descendants.log ./processA
  • -f:跟踪进程及其所有子进程
  • -e trace=fork,vfork,execve:只记录进程创建和执行相关的系统调用
  • 日志文件a_descendants.log中会包含所有由A衍生的进程(包括已结束的B,以及B启动的后续进程)的PID和执行命令,直接查看即可提取信息。

2. 借助系统审计工具auditd追踪(需提前配置)

如果需要长期监控,可配置auditd追踪进程A的所有后代进程:

  1. 添加审计规则:
auditctl -a exit,always -F pid=<A_PID> -S fork -S vfork -S execve
  1. 查看审计日志:
ausearch -i -p <A_PID>

日志中会记录所有由A触发的进程创建事件,包括已结束的进程。

3. 脚本内主动记录PID(最可控的方式)

修改进程A和B的脚本,让它们主动记录所有启动的进程PID到日志文件:

  • 在进程A启动B时,记录B的PID:
    ./processB &
    echo $! >> /tmp/a_descendants.log
    
  • 在进程B启动其他进程时,同样记录PID:
    ./child_process &
    echo $! >> /tmp/a_descendants.log
    

事后直接读取/tmp/a_descendants.log即可获取所有后代进程(含已结束的)。

4. 从系统日志中回溯(限systemd系统)

如果进程A由systemd管理,可通过journalctl查找相关进程创建记录:

journalctl _PID=<A_PID> | grep -E 'execve|fork'

注意:默认日志可能不包含详细进程创建信息,需确保系统开启了进程相关的日志记录。

内容的提问来源于stack exchange,提问作者moth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:37:26