在 Ubuntu/Debian 下的 lsof 命令中,我看到很多如下所示的行:
PROGRAM 829 root 140u sock 0,8 0t0 244182 protocol: TCP
Run Code Online (Sandbox Code Playgroud)
这些线是什么?
它们可能是 TCP 连接尝试失败的结果吗?
当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
Run Code Online (Sandbox Code Playgroud)
在正常情况下,lsof会显示IPv4或IPv6代替sock并且会有附加信息,例如所涉及的侦听端口或地址。即使连接仍在进行中,也会显示所涉及的地址,例如SYN_SENT。