linux上的lsof和netstat有什么区别?

Ale*_*hou 5 linux netstat lsof

我今天遇到一个问题:

当我启动HDP docker容器时,发生错误:

监听TCP 0.0.0.0:8086:绑定:地址已在使用中

根据错误消息,我知道端口8086已被使用,因此我尝试了一些命令来确定哪个程序正在使用端口8086。 lsof -i:8086 lsof -i tcp:8086 lsof | grep 8086

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

我对此感到非常困惑,在Google上进行了一些搜索之后,我尝试了另一个命令: netstat -pna | grep 8086

我从此命令获得正确的输出。

我知道lsof和之间的一些区别netstat,但是我真的不知道为什么我不能从lsof -i:8086?获得任何输出。

这是我从Google搜索到的两个命令之间的一些区别:

netstat(net statistic)是基于连接的,它显示NW连接(udp / tcp端口),路由表,接口,多播成员身份等。

lsof(打开文件列表)是基于应用程序的,类似于netstat + ps,在那里您可以看到所有访问的端口,NW连接等。但是lsof包括诸如本地emacs窗口终端会话(tty dev / pts / n)不属于netstat

sar*_*_pc 7

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

sudo lsof -i:8086 
Run Code Online (Sandbox Code Playgroud)

应该打印所需的输出。


sur*_*oni 7

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

例子:

sudo lsof -n -i
sudo lsof -n -i4
sudo lsof -n -i :80 
Run Code Online (Sandbox Code Playgroud)
  • -n 禁止将网络号转换为网络文件的主机名。禁止转换可能会使 lsof 运行得更快。
    当主机查找无法正常工作时它也很有用
  • -i 选择其 Internet 地址与 i 中指定的地址匹配的文件列表。如果未指定地址,则此选项将选择所有 Internet 和 x.25 (HP-UX) 网络文件的列表。如果指定 -i4 或 -i6 时没有跟随地址,则仅显示指定 IP 版本(IPv4 或 IPv6)的文件。

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

显示内核路由表:

netstat -r 
Run Code Online (Sandbox Code Playgroud)

显示 TCP 和 UDP 的所有侦听和已建立连接以及 PID 数据:

netstat -plunt
Run Code Online (Sandbox Code Playgroud)

此外,您还可以使用另一个命令行工具,那就是 SS。

SS:用于转储套接字统计信息。它允许显示类似于 netstat 的信息。与其他工具相比,它可以显示更多的 TCP 和状态信息。

-plunt给出已建立并侦听进程信息的 TCP 和 UDP 连接的数据:

sudo ss -plunt
Run Code Online (Sandbox Code Playgroud)