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
我从这个命令得到了正确的输出。
我知道 lsof
和 netstat
之间有一些区别,但我真的不知道为什么我无法从 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
问题的正确答案。你的命令没问题,假设确实有东西在监听那个端口。
今天遇到一个问题:
当我启动 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
我从这个命令得到了正确的输出。
我知道 lsof
和 netstat
之间有一些区别,但我真的不知道为什么我无法从 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
:
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
问题的正确答案。你的命令没问题,假设确实有东西在监听那个端口。