登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux strace -ff 追踪多进程时怎样合并子进程日志

来源:17golang原创

时间:2026-09-14 21:06:31 316浏览 收藏

strace -ff 追踪会创建子进程的程序时,看到一组 trace.log.1234trace.log.1235 并不是日志丢失,而是 strace 在按 PID 分离输出。要得到一份方便阅读的总日志,可以在采集时加上 -tt 保留微秒时间戳,结束后运行 strace-log-merge trace.log.* > trace.merged.log。原始文件仍要保留,因为合并结果适合看时间线,PID 文件才适合回到某一个进程核对细节。

要点速览
  • -f 负责跟踪 fork、vfork 和 clone,-ff 额外把每个进程写入独立文件。
  • -o trace.log 配合 -ff 会得到 trace.log.,文件名中的 PID 是定位入口。
  • 合并前使用 -tt-ttt,否则只能拼接文件,无法可靠地按发生时间阅读。

为什么 -ff 会产生多个子进程日志

-f 的含义是 follow forks,strace 会继续跟踪被追踪程序创建的进程;-ff 是在此基础上启用 output separately。只要同时指定 -o trace.log,每个进程的输出就会写到以 PID 结尾的文件,例如 trace.log.4102。这一步保留了进程边界,也避免多个进程同时写一个文件时出现未完成系统调用和恢复标记交错。

因此不要直接执行 cat trace.log.* 就当成时间线。shell 的文件展开通常按文件名排序,PID 大小与系统调用发生时间没有关系;父进程的文件也可能比子进程文件晚展开,但其中包含更早发生的调用。

Linux strace -ff 多进程追踪中父进程、子进程和按 PID 分离日志的静态关系框图
图1:操作示意图。父进程、两个子进程和各自的 PID 日志保持独立,-ff 解决的是输出边界,不是合并排序。

先用时间戳和 PID 采集原始文件

建议把原始日志放到独立目录,并先清理同一前缀的旧文件,避免上一轮 PID 文件混入。下面的命令只展示采集方式;目标程序和参数替换成正在排查的命令。

# 每次使用独立目录,避免旧 PID 文件被通配符带入
trace_dir="trace-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$trace_dir"

# -f 跟随新进程,-ff 按进程分文件,-tt 保留微秒级时间戳
strace -ff -tt -T -o "$trace_dir/trace.log" ./worker --job demo

# 先按文件名确认有哪些进程,再进入合并阶段
find "$trace_dir" -maxdepth 1 -type f -name 'trace.log.*' -print

这里的 -T 还会显示每次系统调用耗时,适合发现某个子进程在 pollread 或文件操作上长时间停顿。若只想看调用先后,保留 -tt 即可;若希望跨天或跨进程比较绝对时间,可使用 -ttt

用 strace-log-merge 得到一份可读时间线

采集完成后,在包含这些文件的目录中执行合并。strace 项目的测试辅助流程也采用“-ff -tt 产生分文件,再用 strace-log-merge 合并”的做法。

# 只匹配本次目录产生的分进程日志,并把合并视图保存下来
strace-log-merge "$trace_dir"/trace.log.* > "$trace_dir/trace.merged.log"

# 合并结果用于全文搜索,原始文件用于按 PID 深挖
grep -nE 'execve|clone|fork|vfork|ENOENT|EACCES' "$trace_dir/trace.merged.log"

合并视图的价值在于把不同 PID 的记录放到同一个时间语境里:你可以先找到 clonefork,再观察子进程随后访问的配置、套接字和文件。它不是新的运行证据,也不会把系统调用重新执行一遍;它只是对已有文本日志做时间线整理。

文件或参数解决的问题常见误区
trace.log.定位单个进程的完整调用按 PID 排序不代表按时间排序
-tt提供微秒级时间信息省略后只能看到调用文本,难以跨文件排序
trace.merged.log统一检索跨进程事件不能替代原始文件,也不能单独证明因果关系
strace-log-merge 将多个带微秒时间戳的 PID 日志整理成统一阅读视图的静态关系框图
图2:结果示意图。多个 PID 日志经过时间戳归并形成统一阅读视图,调用来源仍由 PID 标签保留。

合并后仍要回看原始 PID 文件

如果发现相邻记录的先后关系与业务预期不符,先检查时间戳类型、系统时钟和日志是否来自同一次运行,再回到对应的 trace.log.。多进程之间的“先后”不等于业务层面的“因果”:一个进程写入管道后,另一个进程何时被调度并不只由日志文件名决定。

另外,-ff 不适合和 -c 的每进程统计思路混用;如果目标是统计调用次数和耗时,应单独做统计采集。如果目标是定位某个子进程打开了错误配置文件,保留分文件输出更重要。排查结束后把 trace.merged.log 与原始 PID 文件一起归档,并记录目标命令和采集时间,下一次才能复现同一观察窗口。

常见问题

为什么用了 -ff 还是只有一个文件?

通常是目标程序没有创建新的进程,或者没有指定 -o FILE。先用 strace -ff -tt -o trace.log 的形式确认参数位置,再检查目标是否真的调用了 fork、vfork 或 clone。

可以直接用 cat 合并吗?

可以拼接文本,但文件名顺序不是事件顺序。需要跨 PID 看调用先后时,应在采集阶段保留 -tt,再使用 strace-log-merge;拼接只适合临时查看文件内容。

strace-log-merge 找不到怎么办?

它随部分 strace 打包提供。先执行 command -v strace-log-merge;若发行版拆分了工具包,应安装与 strace 同源的附加包,或先保留 PID 文件,再按时间戳使用本地日志工具整理,避免在没有时间信息时盲目排序。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>