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的所有后代进程:
- 添加审计规则:
auditctl -a exit,always -F pid=<A_PID> -S fork -S vfork -S execve
- 查看审计日志:
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
相关产品推荐
相关产品推荐

