Linux中查看Socket连接状态最直接方式是读取/proc/net/下的tcp、udp、unix等文件统计全局连接,结合/proc/[pid]/fd/定位进程级socket,需注意权限限制和inode匹配。

在 Linux 系统中,查看 Socket 连接状态和实时监控连接数,最直接有效的方式是结合 /proc/net/ 下的接口文件与进程级的 /proc/[pid]/fd/ 目录。这些路径不依赖外部工具,稳定、轻量,适合脚本化和故障排查。
通过 /proc/net/ 查看全局 Socket 状态
/proc/net/ 是内核暴露网络协议栈状态的虚拟文件系统入口,常用文件包括:
-
/proc/net/tcp和/proc/net/tcp6:分别显示 IPv4 和 IPv6 的 TCP 连接(含监听、ESTABLISHED、TIME_WAIT 等状态) -
/proc/net/udp和/proc/net/udp6:UDP 套接字(无连接状态,但可查绑定端口和接收队列) -
/proc/net/unix:本地 Unix 域套接字(含路径、类型、引用计数、连接状态)
每行字段含义需对照内核文档理解。例如 /proc/net/tcp 中第 4 列为十六进制状态码(01 表示 ESTABLISHED,0A 表示 LISTEN),可用 awk + 十六进制转义快速过滤:
awk '$4 == "01" {print $0}' /proc/net/tcp | wc -l # 统计当前 ESTABLISHED 连接数按进程查看 Socket 文件描述符
每个进程的打开文件(含 socket)记录在 /proc/[pid]/fd/ 中。socket 类型的 fd 会以 socket:[inode号] 形式软链接指向:
ls -l /proc/1234/fd/ | grep socket
配合 /proc/net/{tcp,unix} 中的 inode 列,可精准定位某进程打开了哪些 socket。例如:
# 查出进程 1234 所有 socket 的 inode 号
ls -l /proc/1234/fd/ | awk '/socket/ {gsub(/[^0-9]/,"",$11); print $11}' | sort -u
<h1>在 /proc/net/tcp 中匹配这些 inode(第10列)</h1><p>awk 'NR==FNR{a[$1]=1;next} $10 in a' <(上述命令输出) /proc/net/tcp用 /proc/net/ 统计连接数趋势
连接数突增或泄漏常表现为 TIME_WAIT 过多、已连接数飙升或端口耗尽。可编写简单脚本定时采样:
#!/bin/bash
while true; do
echo "$(date '+%H:%M:%S') $(awk '$4=="01"{c++} END{print c+0}' /proc/net/tcp) ESTABLISHED"
sleep 2
done也可用 ss -s(更高效)作对比验证:ss -s 输出中的 “TCP:” 行即汇总自 /proc/net/tcp,但解析更快、支持状态过滤(如 ss -tan state established | wc -l)。
注意权限与稳定性
/proc/net/ 文件对所有用户可读(除非启用了严格的安全模块),但 /proc/[pid]/fd/ 需要能访问对应进程(通常要求同用户或 root)。非 root 用户无法查看其他用户的 socket fd;若看到 Permission denied,说明权限不足或进程已退出(fd 目录消失)。另外,/proc 是实时虚拟文件系统,内容随内核状态动态更新,无需刷新缓存,但也不支持 seek 或 mmap 操作。










