Linux strace -f 跟踪子进程时如何缩小输出
来源:17golang原创
时间:2026-09-15 08:00:29 149浏览 收藏
Linux 上用 strace -f 排查程序时,输出突然变得很长,通常不是子进程“失控”,而是你同时看到了父进程和所有后代进程的全部系统调用。缩小输出要分层做:先用 -e trace=... 限制调用类别,再用 -P 限制路径;需要整理多进程日志时,再加 -o、-ff 和 -qq。每次只加一个筛选条件,才知道究竟隐藏了什么。
排障时先保留 -f,不要一上来删掉子进程;优先收窄“看哪些调用”和“看哪个路径”,最后才处理输出文件和参数长度。过滤后的空白只能说明“没有留下匹配项”,不能直接证明调用没有发生。
-f负责跟踪子进程,-e trace=...负责按系统调用类别过滤,两者解决的是不同问题。-P /path可以把观察范围收窄到路径;-o trace -ff则把不同 PID 的输出拆开,便于定位。- 先用宽过滤建立基线,再逐项增加条件,并保留返回值,避免把“被隐藏”误判成“没执行”。
先用过滤器控制跟踪范围
-f 会让 strace 继续跟踪由当前进程创建或派生出来的进程,但它不会替你判断哪些调用重要。若问题是“子进程到底打开了哪些配置文件”,可以先只保留文件相关调用:
# 保留父子进程关系,只观察文件相关系统调用 strace -f -e trace=file -- ./worker # 再把目标路径限制在应用配置目录;示例路径请替换为实际目录 strace -f -e trace=file -P /srv/app/config -- ./worker
-e trace=file 是调用集合过滤,-P 是路径过滤;它们不是“只跟踪某个 PID”的替代品。若过滤后没有输出,先撤掉 -P 看宽范围结果,再判断是路径不匹配还是程序没有走文件调用。

用文件和 PID 维度整理结果
多进程同时向标准错误输出时,父子进程的行会交错。可以把输出写入文件;加上 -ff 后,strace 会按进程拆分输出文件,文件名会带上对应 PID。这样更适合回答“是哪一个子进程返回了 ENOENT”这类问题:
# 把跟踪写入文件,并按 PID 拆分;-qq 减少附加提示行 strace -f -o trace -ff -qq -- ./worker # 只查看各 PID 文件中的关键调用和返回值 rg 'execve|openat|read|ENOENT' trace.*
这里的 -ff 解决的是文件组织,不是过滤;仍然会记录很多调用。若只想看某个目标目录,可把它与上一节的 -e trace=file -P /srv/app/config 组合使用。-qq 只减少提示噪声,不会替你筛选系统调用。
| 参数 | 作用 | 适合回答 |
|---|---|---|
-f | 跟踪派生进程 | 子进程是否参与 |
-e trace=... | 按调用类别筛选 | 只看文件、网络或进程调用 |
-P | 按路径筛选 | 谁访问了某个文件或目录 |
-o ... -ff | 按 PID 整理输出 | 哪一个进程产生了结果 |
-s | 调整字符串显示长度 | 参数被截断时补足上下文 |

按问题调整参数细节
如果真正的问题是“文件名或环境变量被截断”,再调整 -s,例如 -s 256;它改变字符串显示长度,不会减少系统调用数量。只想看调用统计时可以使用 -c,但统计模式适合找频率和耗时概况,不适合还原某一次调用的参数与返回值。
# 需要看较长路径或参数时提高字符串显示长度 strace -f -s 256 -e trace=file -- ./worker # 只做系统调用汇总;它不是逐行跟踪日志 strace -f -c -- ./worker
不要同时堆上十几个选项再解释结果。推荐顺序是:无路径限制的 -e trace=file 建基线;加入 -P;输出变乱时加入 -o -ff;参数缺信息时才加 -s;需要统计时另跑一次 -c。
验证筛选没有把关键调用藏掉
最容易误判的场景是:加了 -P 后没有结果,就认定程序没有访问目标文件。更稳妥的检查是逐层撤销条件,并记录每一步的观察范围:
- 先运行
strace -f -e trace=file,确认子进程确实出现在输出中。 - 再加
-P /目标路径,比较是否只剩目标路径相关行。 - 再改用
-o trace -ff,按trace.PID逐个查看,并关注= 0、= -1 ENOENT等返回值。 - 若参数仍不完整,只增加
-s;不要用更强的过滤器掩盖上下文。
最后把“没有匹配输出”和“调用返回成功”分开记录。strace 只能展示被它捕获并保留下来的系统调用;过滤条件越窄,越需要回到宽范围基线复核。
常见问题
为什么用了 -f 还是看不到子进程的关键调用?
可能是后续的 -e 或 -P 把调用过滤掉了,也可能子进程很快执行了 execve。先去掉路径过滤,保留 -f -e trace=process 或宽范围基线,再按 PID 回看。
-ff 和 -f 有什么区别?
-f 决定是否跟踪派生进程;-ff 在此基础上把每个进程的输出写到独立文件。它们分别控制“跟谁”和“怎么整理输出”。
输出太长时只用 -qq 可以吗?
不行。-qq 主要减少附加提示,不能替代系统调用或路径过滤。应先使用 -e、-P 收窄观察对象,再按需要用 -o -ff 整理文件。
-
426 收藏
-
387 收藏
-
242 收藏
-
436 收藏
-
238 收藏
-
324 收藏
-
文章 · linux | 4小时前 | systemd · 日志排查 · journalctl · 运维命令 · Linux教程 · Linux journalctl --since --until --boot 启动编号 Boot ID systemd 日志127 收藏
-
418 收藏
-
215 收藏
-
270 收藏
-
486 收藏
-
316 收藏
-
文章 · linux | 14小时前 | 命令行工具 · udev · Linux设备管理 · 内核事件 · 系统排障 · Linux udevadm monitor udev 内核事件 udev 规则动作 udevadm property subsystem 过滤498 收藏
-
431 收藏
-
421 收藏
-
357 收藏
-
383 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习