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

What are the differences between lsof and netstat on linux?

今天遇到一个问题:

当我启动 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

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

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

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

我知道 lsofnetstat 之间有一些区别,但我真的不知道为什么我无法从 lsof -i:8086?.

以下是我从 google 中搜索到的两个命令之间的一些差异:

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

lsof(list of open files) 是基于应用程序的,这有点像 netstat + ps,在那里你可以看到所有访问的端口、NW 连接等。 但是 lsof 包括像我的本地 emacs window 终端会话 (tty dev/pts/n) 这样的东西,它不是 netstat

的一部分

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

您应该能够通过 netstat:

找到侦听端口 8086 的进程的 PID
netstat -tunlp |grep :8086

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

lsof -p PID

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

sudo lsof -i:8086 

应该打印所需的输出。

LSOF: List of Open Files. It lists all the open files belonging to all active processes.

示例:

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

NETSTAT: It is a tool to get the network statistics. By default, netstat displays a list of open sockets. If you don't specify any address families, then the active sockets of all configured address families will be printed.

显示内核路由表:

netstat -r 

使用 PID 数据显示所有侦听和建立的 TCP 和 UDP 连接:

netstat -plunt

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

SS: It is used to dump socket statistics. It allows showing information similar to netstat. It can display more TCP and state information than other tools.

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

sudo ss -plunt

您应该是 root 才能获得 lsof 问题的正确答案。你的命令没问题,假设确实有东西在监听那个端口。