Linux strace -ff 追踪多进程时怎样合并子进程日志
来源:17golang原创
时间:2026-09-14 21:06:31 316浏览 收藏
用 strace -ff 追踪会创建子进程的程序时,看到一组 trace.log.1234、trace.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 大小与系统调用发生时间没有关系;父进程的文件也可能比子进程文件晚展开,但其中包含更早发生的调用。

先用时间戳和 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 还会显示每次系统调用耗时,适合发现某个子进程在 poll、read 或文件操作上长时间停顿。若只想看调用先后,保留 -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 的记录放到同一个时间语境里:你可以先找到 clone 或 fork,再观察子进程随后访问的配置、套接字和文件。它不是新的运行证据,也不会把系统调用重新执行一遍;它只是对已有文本日志做时间线整理。
| 文件或参数 | 解决的问题 | 常见误区 |
|---|---|---|
trace.log. | 定位单个进程的完整调用 | 按 PID 排序不代表按时间排序 |
-tt | 提供微秒级时间信息 | 省略后只能看到调用文本,难以跨文件排序 |
trace.merged.log | 统一检索跨进程事件 | 不能替代原始文件,也不能单独证明因果关系 |

合并后仍要回看原始 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 文件,再按时间戳使用本地日志工具整理,避免在没有时间信息时盲目排序。
-
426 收藏
-
387 收藏
-
242 收藏
-
238 收藏
-
402 收藏
-
486 收藏
-
文章 · linux | 3小时前 | 命令行工具 · udev · Linux设备管理 · 内核事件 · 系统排障 · Linux udevadm monitor udev 内核事件 udev 规则动作 udevadm property subsystem 过滤498 收藏
-
431 收藏
-
421 收藏
-
357 收藏
-
383 收藏
-
340 收藏
-
298 收藏
-
358 收藏
-
314 收藏
-
317 收藏
-
449 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习