在 Ubuntu/Debian 下的 lsof 命令中,我看到很多如下行:
PROGRAM 829 root 140u sock 0,8 0t0 244182 protocol: TCP
这些线是什么?
它们可能是 TCP 连接尝试失败的结果吗?
答案1
lsof
当无法在 TCP 套接字上找到其他信息时,会显示此行:它知道它是一个 TCP 套接字,但仅此而已。
我能想到有两个原因:
不太可能:套接字仍未监听或连接:例如使用的服务器或客户端
socket(AF_INET, SOCK_STREAM, 0)
创建 TCP 套接字但尚未调用listen(2)
或者connect(2)
。这可能是由于资源不足或软件有缺陷造成的。lsof
今天最有可能的是:在另一个运行中看到的过程网络命名空间,通常在容器中(Docker、LXC、LXD……),因此lsof
无法访问相关信息并且不会显示它。然后,您应该
lsof
从与该进程相同的网络命名空间运行。lsns
和nsenter
命令可以极大地帮助实现这一点。对于你的情况,下面这个可能有效:nsenter -t 829 --net lsof -n -p 829
在正常情况下lsof
,会显示IPv4
或IPv6
而不是sock
,并会显示附加信息,如监听端口或相关地址。即使连接仍在进行中,也会显示相关地址,例如SYN_SENT
。