在Linux上,lsof和netstat有什么区别?

13

今天我遇到了一个问题:

当我启动HDP docker容器时,出现了一个错误:

listen tcp 0.0.0.0:8086: bind: address already in use

根据错误消息,我知道端口8086已经被占用,所以我尝试了一些命令来确定哪个程序正在使用端口8086。

lsof -i:8086 lsof -i tcp:8086 lsof | grep 8086

但是所有上述的命令都没有输出!

我对此感到非常困惑,在谷歌上搜索了一些内容后,我尝试了另一个命令:

netstat -pna | grep 8086

我从这个命令中得到了正确的输出结果。

我知道“lsof”和“netstat”之间存在一些差异,但我真的不知道为什么我无法从“lsof -i:8086”获得任何输出呢?

以下是我从Google上搜索到的两条命令之间的一些区别:

netstat(网络统计)是基于连接的,它显示NW连接(udp/tcp端口)、路由表、接口、多播成员等。

lsof(打开文件列表)是基于应用程序的,这有点像netstat+ps,您可以看到所有访问的端口、NW连接等,但lsof包括诸如我的本地emacs窗口终端会话(tty dev/pts/n)之类的内容,这不是netstat的一部分。


与其问 lsofnetstat 之间的区别,不如问一下 为什么 lsof -i:8086 没有工作?否则你只会得到谷歌和 man 手册上的答案。 - C0deDaedalus
4个回答

12

我今天遇到了类似的问题。解决方法是使用sudo特权运行lsof命令。

sudo lsof -i:8086 

应该打印所需的输出。


7

LSOF(打开文件列表):它列出所有属于所有活动进程的打开文件。

示例:

sudo lsof -n -i
sudo lsof -n -i4
sudo lsof -n -i :80 
  • -n 抑制网络文件中网络编号转换为主机名。抑制转换可能会使 lsof 运行更快。当主机查找无法正常工作时也很有用。
  • -i 选择列出任何 Internet 地址与 i 指定的地址匹配的文件列表。如果没有指定地址,则此选项选择所有 Internet 和 x.25 (HP-UX) 网络文件的列表。如果使用 -i4 或 -i6 并且没有后续地址,那么只会显示所指示 IP 版本(IPv4 或 IPv6)的文件。

NETSTAT:它是一个获取网络统计信息的工具。默认情况下,netstat 显示打开套接字的列表。如果您未指定任何地址族,则将打印所有已配置地址族的活动套接字。

显示内核路由表:

netstat -r 

显示所有TCP和UDP的监听和已建立连接,并附带PID数据:
netstat -plunt

此外,您还有另一个可用的命令行工具,即SS。
SS: 它用于转储套接字统计信息。它允许显示类似于netstat的信息。它可以显示比其他工具更多的TCP和状态信息。 -plunt 提供已建立和侦听的TCP和UDP连接的数据,并附带进程信息:
sudo ss -plunt

回复很好,提供了很多信息!非常有用。谢谢! - rodolk

1

你需要以root身份才能获得关于lsof问题的正确答案。假设有东西确实在那个端口上监听,那么你的命令是正确的。


0

正如您已经提到的,lsof是一个非常有用的命令,用于列出特定进程打开的文件,而netstat是用于监视网络连接的工具。

您应该能够使用netstat找到在端口8086上监听的进程的PID:

netstat -tunlp |grep :8086

然后使用lsof列出进程使用的文件:

lsof -p PID

1
好的,谢谢。但是为什么我无法获得lsof -i:8086的输出?一个进程绝对在监听8086端口,但是我无法通过执行lsof命令来获取输出,这很奇怪。 - Alec.Zhou
@Alec.Zhou 你可能需要使用 sudo lsof -i:8086 命令来查看你没有拥有的套接字。 - Jesse Chisholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接