strace -e trace=network 可监控网络系统调用,但需注意版本兼容性:Ubuntu 22.04+/kernel 5.15+/strace 5.15+ 支持完整展开,CentOS 7 等旧环境建议显式指定 connect、accept4、socket 等调用,并配合 -f、-s 256、-tt、-o 等参数确保有效追踪。

直接用 strace -e trace=network 就能只监控网络相关的系统调用,但要注意:这个集合名是“预定义别名”,不是所有系统都默认支持完整展开,尤其老版本 strace 或内核可能识别不全。
确保 network 集合生效的关键点
network 集合实际包含 connect、accept、accept4、bind、listen、sendto、recvfrom、socket、setsockopt、getsockopt 等典型网络调用。但 strace 不会自动把 open、read、write 这类通用调用归入其中——它们属于 file 或其他类别。
- Ubuntu 22.04+、较新 kernel(如 5.15+)和 strace 5.15+ 默认支持
trace=network完整展开 - CentOS 7 自带 strace 4.12,
trace=network可能漏掉 accept4、sendto 等较新的调用,建议显式列出:-e trace=connect,accept,accept4,socket,sendto,recvfrom - 运行
strace -e trace=network true 2>&1 | head -5可快速验证是否识别成功(有输出即有效,无输出或报错说明不支持)
常用搭配参数提升实用性
单靠 -e trace=network 往往不够,配合以下选项才能看清真实行为:
-
-f:必须加,否则 fork 出的子进程(如 nginx worker、Python 多进程服务)的网络调用会被忽略 -
-s 256:把字符串截断长度从默认 32 扩大,否则 socket 地址、域名、HTTP header 等关键信息被截成..." -
-tt:每行前加微秒级时间戳,方便判断连接建立耗时、超时位置 -
-o /tmp/net.log:用-o保存到文件,不要用> net.log重定向,否则 stderr 中的错误(如 permission denied)会丢失
实际使用示例
监控正在运行的 Redis 实例的网络行为:
pgrep redis-server | head -1 | xargs -I{} strace -p {} -f -e trace=network -s 256 -tt -o /tmp/redis-net.log启动一个 curl 并只看它的网络动作:
strace -e trace=network -f -s 256 -tt curl -s http://httpbin.org/get 2>&1 | grep -E "(connect|sendto|recvfrom|socket)"如果看不到 connect 或 sendto 怎么办
不是程序没调用,而是 strace 没抓到。常见原因:
- 没加
-f,目标程序用多进程模型(如 Apache prefork),主进程不发包,worker 才发 - 用了
epoll_wait或io_uring等异步机制,network 集合不包含这些——需额外加-e trace=epoll_wait,io_uring_enter - 程序用 UDP 且未 bind 直接 sendto,某些 strace 版本对 UDP 的 sendto 抓取不稳定,可改用
-e trace=sendto,recvfrom显式指定


















