linux 查看端口占用 netstat, lsof, ss, fuser 笔记241123
linux 查看端口占用 netstat, lsof, ss, fuser
在 Linux 系统中,你可以使用多种命令来查看哪个进程占用了特定的端口。以下是一些常用的方法:
在 Linux 系统中,查看端口占用情况可以使用多种工具和命令。以下是几种常用的方法:
使用 netstat
netstat
是一个强大的网络统计工具,可以显示网络连接、路由表、接口统计、伪装连接和多播成员等信息。要查看端口占用情况,可以使用以下命令:
sudo netstat -tuln
解释:
-t
:显示 TCP 端口-u
:显示 UDP 端口-l
:显示监听状态的端口-n
:以数字形式显示地址和端口号
使用 ss
ss
是 netstat
的替代品,用于显示套接字统计信息。它通常比 netstat
更快、更高效。要查看端口占用情况,可以使用以下命令:
sudo ss -tuln
参数含义与 netstat
类似:
-t
:显示 TCP 端口-u
:显示 UDP 端口-l
:显示监听状态的端口-n
:以数字形式显示地址和端口号
使用 lsof
lsof
(List Open Files)是一个列出当前系统打开文件的工具。由于在 Linux 中,几乎所有东西都被当作文件处理,包括网络连接,因此 lsof
也可以用来查看端口占用情况:
sudo lsof -i -P -n
解释:
-i
:显示网络相关的信息-P
:显示端口号而不是服务名-n
:不解析主机名
使用 fuser
fuser
可以显示哪些进程正在使用某个文件、套接字或文件系统。要查看某个特定端口的占用情况,可以使用以下命令:
sudo fuser -n tcp 22
这个命令会显示正在使用 TCP 端口 22(通常是 SSH 服务)的进程 ID。
示例:查找特定端口的占用情况
假设你想查找端口 8080 是否被占用,可以使用以下任一命令:
-
使用
netstat
:sudo netstat -tuln | grep 8080
-
使用
ss
:sudo ss -tuln | grep 8080
-
使用
lsof
:sudo lsof -iTCP -sTCP:LISTEN -P | grep 8080
-
使用
fuser
:sudo fuser 8080/tcp
这些命令会帮助你找到正在使用指定端口的进程,从而进行相应的处理,比如杀掉进程或更改端口配置。
使用 netstat
netstat
是一个网络相关的命令行工具,可以显示网络连接、路由表、接口统计信息等。
sudo netstat -tuln | grep :<端口号>
例如,要查看端口 8080 是否被占用,可以运行:
sudo netstat -tuln | grep :8080
然而,netstat
不会显示占用端口的进程 ID(PID)。为了显示 PID,可以结合 lsof
或 ss
命令使用。
使用 lsof
lsof
是一个列出当前系统打开文件的工具,因为网络连接在 Linux 中也是文件的一种,所以 lsof
可以用来查看端口占用情况。
sudo lsof -i :<端口号>
例如,要查看端口 8080 的占用情况,可以运行:
sudo lsof -i :8080
这将显示使用该端口的进程及其详细信息,包括 PID。
使用 ss
ss
是一个新的工具,用于显示套接字统计信息,可以替代 netstat
。
sudo ss -tuln | grep :<端口号>
要查看占用端口的进程信息,可以使用 -p
选项:
sudo ss -tulnp | grep :<端口号>
例如,要查看端口 8080 的占用情况及其进程信息,可以运行:
sudo ss -tulnp | grep :8080
使用 fuser
fuser
命令可以显示哪个进程正在使用某个文件、套接字或文件系统。
sudo fuser <端口号>/tcp
例如,要查看端口 8080 的占用情况,可以运行:
sudo fuser 8080/tcp
你还可以使用 -v
选项获取更多信息:
sudo fuser -v 8080/tcp
示例
假设你想查看端口 8080 是否被占用,并且想知道是哪个进程占用了它,可以使用以下命令之一:
sudo lsof -i :8080
# 或者
sudo ss -tulnp | grep :8080
# 或者
sudo fuser -v 8080/tcp
这些命令将帮助你找到占用端口的进程及其详细信息。
netstat
、lsof
、ss
和 fuser
是 Linux 系统中用于查看网络状态和文件(包括套接字)使用情况的强大工具。下面是对这四个工具的简要介绍和比较:
netstat
netstat
是一个历史悠久的网络统计工具,它能够显示网络连接、路由表、接口统计、伪装连接、多播成员等信息。尽管功能强大,但 netstat
在某些系统上可能不是最快的选项,因为它可能需要从多个源收集信息并进行汇总。
常用命令示例:
- 查看所有监听端口:
netstat -tuln
- 查看所有网络连接:
netstat -an
- 显示路由表:
netstat -r
- 显示网络接口统计:
netstat -i
lsof
lsof
(List Open Files)用于列出当前系统打开的文件。在 Linux 中,网络连接也被视为文件,因此 lsof
可以用来查看哪些进程打开了哪些网络连接。lsof
的输出可能非常详细,有时需要一些过滤来找到感兴趣的信息。
常用命令示例:
- 查看所有网络连接:
lsof -i
- 查看特定端口的连接:
lsof -i :8080
(注意这里的端口号前有一个冒号) - 查看某个进程打开的文件:
lsof -p PID
(其中 PID 是进程 ID)
ss
ss
是 netstat
的一个更现代、更高效的替代品。它能够更快地显示网络连接的统计信息,因为它直接从内核中获取信息,而不需要像 netstat
那样进行汇总。ss
的输出格式也更加灵活和易于理解。
常用命令示例:
- 查看所有监听端口:
ss -tuln
- 查看所有网络连接:
ss -an
- 查看特定进程的连接:
ss -p PID
fuser
fuser
用于显示哪些进程正在使用某个文件、套接字或文件系统。它可以用来查找哪个进程正在监听某个端口,或者哪个进程正在访问某个特定的文件。fuser
的输出通常是一个进程 ID 列表。
常用命令示例:
- 查看正在使用某个端口的进程:
fuser -n tcp PORT
(其中 PORT 是端口号) - 查看正在访问某个文件的进程:
fuser FILENAME
- 杀掉正在使用某个端口的所有进程:
fuser -k -n tcp PORT
(注意:使用-k
选项时要非常小心)
比较
- 性能:
ss
通常比netstat
更快,因为它直接从内核获取信息。 - 功能:
netstat
和ss
提供了类似的功能集,但ss
的输出格式更灵活。lsof
和fuser
则提供了不同的视角,分别关注打开的文件和正在使用文件的进程。 - 易用性:
ss
的输出通常更容易理解,而lsof
的输出可能需要一些额外的过滤来找到有用的信息。fuser
则非常直接,用于查找特定文件或套接字的进程。 - 兼容性:
netstat
在许多系统上都是可用的,但一些较新的系统可能更倾向于使用ss
。lsof
和fuser
也通常可在大多数 Linux 发行版上找到。
在选择使用哪个工具时,通常取决于具体的需求和偏好。例如,如果你需要快速查看网络连接状态,ss
可能是一个好选择。如果你需要查找哪个进程正在使用某个特定的文件或端口,fuser
可能会更方便。而 lsof
则提供了更广泛的视角,可以查看所有打开的文件,包括网络连接和常规文件。
netstat
命令
netstat
是一个网络统计工具,它能够显示网络连接、路由表、接口统计、伪装连接以及多播成员等多种网络信息。尽管在某些系统上,netstat
可能已经被 ss
等更现代的工具所取代,但它仍然是一个非常有用的命令行工具,特别是在需要快速查看网络状态时。
以下是 netstat
命令的一些常见用法和选项:
基本用法
netstat
:显示所有活动的网络连接,包括 TCP 和 UDP 连接,以及监听状态的端口。
常用选项
-a
:显示所有连接和监听端口,包括 TCP 和 UDP。-t
:仅显示 TCP 连接。-u
:仅显示 UDP 连接。-l
:显示监听状态的端口。-n
:以数字形式显示地址和端口号,而不是尝试解析主机名和服务名。-p
:显示与每个连接相关的进程 ID 和进程名称(需要 root 权限)。-r
:显示路由表。-i
:显示网络接口统计信息。-c
:每隔一段时间(默认是 1 秒)重新显示一次信息,直到用户中断。
组合使用
netstat -tuln
:显示所有监听状态的 TCP 和 UDP 端口,并以数字形式显示地址和端口号。netstat -anp
:显示所有活动的网络连接,包括进程 ID 和进程名称(需要 root 权限)。netstat -r
:查看系统的路由表。netstat -i
:查看网络接口的统计信息,如数据包收发情况等。
示例
-
查看所有活动的 TCP 连接:
netstat -at
-
查看所有监听状态的端口,并以数字形式显示:
netstat -tuln
-
显示网络接口统计信息:
netstat -i
-
每隔 2 秒重新显示一次所有活动的网络连接:
netstat -c 2
-
显示与每个连接相关的进程信息(需要 root 权限):
sudo netstat -anp
请注意,netstat
命令的输出可能会因系统配置和版本的不同而略有差异。此外,随着 Linux 系统的更新,一些较新的发行版可能默认不包含 netstat
,而是推荐使用 ss
等替代工具。如果你发现你的系统上没有 netstat
,你可以尝试安装 net-tools
包,它通常包含了 netstat
。
ss
命令
ss
命令是 Linux 系统中的一个网络工具命令,用于查看系统的套接字(Socket)情况。它提供了丰富的功能和选项,可以显示当前系统的所有套接字信息,包括 TCP 和 UDP 连接,以及相关的统计数据。以下是关于 ss
命令的详细解释和常见用法:
基本语法
ss [选项] [过滤器]
常用选项
-t
:仅显示 TCP 连接。-u
:仅显示 UDP 连接。-l
:仅显示监听状态的套接字。-a
:显示所有套接字,包括监听和非监听状态的。-n
:以数字形式显示 IP 地址和端口号,不进行主机名和服务名解析。-p
:显示与套接字关联的进程信息。-e
:显示详细的套接字信息,包括获取用户信息。-s
:显示网络连接相关的统计数据。-o
:显示套接字的计时器信息。-i
:显示内部 TCP 信息。-H
:以人类可读的格式显示时间戳。-Z
:显示 SELinux 安全上下文信息(需要 root 权限)。
过滤器
ss
命令还支持使用过滤器来精确控制输出内容。常用的过滤器包括:
state [状态]
:根据连接的状态进行过滤,如ESTABLISHED
、TIME_WAIT
等。sport = :端口号
:根据源端口进行过滤。dport = :端口号
:根据目标端口进行过滤。src [地址]
:根据源 IP 地址进行过滤。dst [地址]
:根据目标 IP 地址进行过滤。
常见用法示例
-
显示所有 TCP 连接:
ss -t
-
显示所有 UDP 连接:
ss -u
-
显示所有监听状态的套接字:
ss -l
-
显示所有套接字,包括监听和非监听状态的:
ss -a
-
显示所有 TCP 连接,并以数字形式显示 IP 地址和端口号:
ss -tn
-
显示与套接字关联的进程信息:
ss -p
-
显示特定状态的 TCP 连接,如所有已建立的连接:
ss -t state established
-
显示所有监听 80 端口的连接:
ss -t state listening dport = :80
-
显示所有本地端口为 22 的连接:
ss sport = :22
-
显示所有目标地址为 192.168.0.1 的连接:
ss dst 192.168.0.1
与其他命令结合使用
ss
命令的输出可以与 grep
、awk
、sort
等命令结合使用,进行更复杂的数据处理和过滤。例如,可以使用以下命令来显示所有 TCP 连接,并过滤出与指定 IP 地址相关的连接:
ss -t | grep '192.168.0.1'
注意事项
- 使用某些选项(如
-p
显示进程信息)可能需要 root 权限。 ss
命令的输出可能因系统配置和版本的不同而略有差异。- 在处理大量网络连接时,
ss
命令通常比netstat
更高效,因为它直接从内核获取信息。
ss
命令是 Linux 系统管理员进行网络故障排除和性能优化时的一个有力工具。通过灵活使用不同的选项和过滤器,可以方便地查看和分析系统上的网络套接字信息。
lsof
命令
lsof
(list open files)是一个用于列出当前系统打开文件的工具。在 Linux 环境下,任何事物都以文件的形式存在,包括常规文件、目录、网络连接(如 TCP 和 UDP 套接字)、字符和块设备文件等。lsof
可以帮助用户和系统管理员查看哪些进程打开了哪些文件,以及哪些网络连接正在被使用。
以下是关于 lsof
命令的详细解释和常见用法:
基本语法
lsof [选项] [文件]
常见选项
-a
:逻辑与(AND),表示所有选项都必须满足。-c <进程名>
:列出指定进程名所打开的文件。-g
:列出指定 GID(组 ID)的进程所打开的文件。-d <文件号>
:列出占用该文件号的进程。+d <目录>
:列出指定目录下被打开的文件。+D <目录>
:递归列出指定目录下被打开的文件。-i
:列出打开的网络连接(TCP、UDP)。-i[46] [protocol][@hostname|hostaddr][:service|port]
:更细粒度地列出网络连接,其中 46 表示 IPv4 或 IPv6,protocol 表示 TCP 或 UDP,hostname 表示主机名,hostaddr 表示 IP 地址,service 表示服务名,port 表示端口号。-n
:不将 IP 地址转换为主机名。-p <进程号>
:列出指定进程号所打开的文件。-u <用户名>
:列出指定用户打开的文件。-v
:显示版本信息。
输出信息解释
lsof
命令的输出通常包含以下列:
COMMAND
:进程名称。PID
:进程标识符。USER
:进程所有者。FD
:文件描述符,应用程序通过文件描述符识别该文件。例如,cwd 表示当前工作目录,txt 表示程序代码文件。TYPE
:文件类型,如 REG(常规文件)、DIR(目录)、CHR(字符设备)、FIFO(命名管道)、SOCK(套接字)等。DEVICE
:设备标识符。SIZE/OFF
:文件大小或偏移量。NODE
:索引节点号。NAME
:打开文件的路径和文件名。
常见用法示例
-
列出当前系统打开的所有文件:
lsof
-
列出指定进程打开的文件:
lsof -c mysql
-
列出指定用户打开的文件:
lsof -u username
-
列出指定目录下被打开的文件:
lsof +d /path/to/directory
-
列出所有网络连接:
lsof -i
-
列出特定端口的网络连接:
lsof -i :80
-
列出特定用户打开的特定端口的网络连接:
lsof -a -u username -i tcp:80
-
列出所有 TCP 网络连接:
lsof -i tcp
-
列出所有 UDP 网络连接:
lsof -i udp
-
列出所有打开的文件,并过滤出包含某个关键字的文件名:
lsof | grep keyword
注意事项
lsof
命令需要访问核心内存和各种文件,因此通常需要 root 用户权限来执行。lsof
的输出可能非常详细,有时需要结合grep
等工具进行过滤,以找到感兴趣的信息。- 在处理大量输出时,可以使用
less
或more
命令进行分页查看。
lsof
命令是 Linux 系统管理和故障排除中的一个强大工具,通过它可以深入了解系统当前的文件和网络连接状态。
fuser
命令
fuser
命令是 Linux 操作系统中一个常用的命令,用于查找和显示正在使用文件或文件系统的进程。它可以帮助用户找出哪些进程正在访问某个文件或目录,进而进行相关的操作。以下是关于 fuser
命令的详细解释和常见用法:
基本语法
fuser [选项] 文件/目录路径
常用选项
-a
:显示所有文件被访问的信息。-c
:显示所有与指定文件在同一文件系统的被访问文件的信息。-d
:显示所有与指定文件在同一文件系统的被访问文件的信息,但忽略没有链接的文件。-f
:将文件视为普通文件,而不是套接字或命名管道。-i
:交互式模式,在杀死进程前进行询问。-k
:发送 SIGKILL 信号给使用该文件的进程,强制关闭它们。-l
:列出所有已知的信号名称。-m
:查找与指定挂载点相关联的进程。-n
:指定网络协议(如 TCP、UDP)和端口号,用于查找使用特定网络端口的进程。-s
:静默模式,不显示警告信息。-u
:显示使用文件的进程的用户 ID。-v
:显示详细的进程信息。-V
:显示版本信息。-w
:仅显示有写访问的进程。-x
:显示没有链接的文件。
常见用法示例
-
查找使用某个文件的进程:
fuser /path/to/file
这将显示正在使用该文件的进程的进程号(PID)。
-
显示详细的进程信息:
fuser -v /path/to/file
这将显示使用该文件的进程的详细信息,包括进程 ID、用户、命令行等。
-
强制关闭使用某个文件的进程:
fuser -k /path/to/file
这将发送 SIGKILL 信号给使用该文件的进程,强制关闭它们。请注意,此操作可能会造成数据丢失,应谨慎使用。
-
查找使用某个目录的进程:
fuser -m /path/to/directory
这将显示正在使用该目录的进程的进程号。
-
查找使用特定网络端口的进程:
fuser -n tcp 80
这将显示使用 TCP 端口 80 的进程的进程号。
-
查找使用某个文件的进程并显示用户信息:
fuser -u /path/to/file
这将显示使用该文件的进程的用户 ID。
注意事项
- 使用
fuser
命令的-k
选项强制关闭进程时,可能会导致数据丢失或系统不稳定,因此应谨慎使用。 - 在某些情况下,可能需要 root 权限才能执行
fuser
命令或查看某些进程的信息。 fuser
命令的输出可能因系统配置和版本的不同而略有差异。
fuser
命令是 Linux 系统中用于查看和控制文件进程的实用工具,通过它可以方便地找出哪些进程正在使用某个文件或目录,并根据需要进行管理。