【linux查看端口占用进程】是什么?为什么需要查看?

在 Linux 系统中,一个服务或应用程序需要通过特定的“端口”来与外界进行网络通信。例如,网页服务通常使用 80 (HTTP) 或 443 (HTTPS) 端口,SSH 服务使用 22 端口。

“查看端口占用进程”指的是找出当前系统上哪个进程(即哪个运行中的程序)正在使用或监听某个特定的网络端口。了解这一点至关重要,因为一个端口通常只能被一个进程占用(某些特殊情况下除外,如使用了 `SO_REUSEPORT` 选项)。

为什么我们需要查看端口占用?

  • 端口冲突:当你尝试启动一个新服务,但它所需的端口已经被另一个程序占用时,新服务就会启动失败并报错(常见的错误信息可能包含 “Address already in use” 或 “Permission denied” 如果是低端口)。这时就需要查出是谁占用了端口。
  • 调试网络应用:开发或部署网络应用程序时,需要确认程序是否成功启动并监听在预期的端口上,以及是否有其他意外进程干扰。
  • 安全审计:检查系统上是否有未经授权的进程在监听非标准端口,这可能是潜在的安全风险。
  • 资源管理:了解哪些进程正在使用网络资源。

【linux查看端口占用进程】在哪里可以进行?需要什么权限?

这项操作通常在 Linux 系统的命令行终端(如 Bash, Zsh 等)中进行。你可以在本地登录的终端执行命令,也可以通过 SSH 等方式远程连接到 Linux 服务器上执行。

执行查看端口占用进程的命令,在大多数情况下,如果你只想看端口信息,普通用户就可以。但是,要查看端口对应的进程 ID (PID) 和程序名称,尤其是那些由其他用户或 root 启动的进程,通常需要具有足够的权限。最简单和常见的方式是使用 `sudo` 命令以前缀形式执行这些命令,以获取超级用户(root)的权限,这样才能看到所有进程的详细信息。

例如:

sudo netstat -tunlp

sudo ss -tunlp

sudo lsof -i :80

如果没有使用 `sudo`,你可能只能看到当前用户启动的进程所占用的端口信息,而由 root 或其他用户启动的服务(比如 web 服务器、数据库服务等)的进程信息(如 PID 和程序名)将无法显示。

【linux查看端口占用进程】有多少种工具或方法?

在 Linux 系统中,有几种常用的工具可以用来查看端口占用进程:

  1. netstat (network statistics): 这是最传统和广泛使用的工具之一,用于显示网络连接、路由表、接口统计等信息。通过特定的参数组合,它可以显示正在监听的端口及其对应的进程信息。
  2. ss (socket statistics): 这是 netstat 的一个更新、更快、更强大的替代品,尤其在处理大量网络连接时性能更优。它的语法与 netstat 类似,同样可以方便地查看端口占用情况。
  3. lsof (list open files): 这个命令用于列出当前系统打开的文件。在 Linux 中,“一切皆文件”,网络套接字也被视为一种文件。因此,lsof 可以用来列出所有打开了网络套接字(即监听或连接了端口)的进程。
  4. fuser: 这个命令可以识别正在使用文件或套接字的进程 PID。虽然不如 netstatss 直观显示所有监听端口,但当你只想知道哪个进程占用了某个特定端口时,它也非常快捷。

在实际使用中,netstatss 是最常用的工具,它们能列出所有监听中的端口;而 lsoffuser 更适合用来检查某个*特定*端口。

【linux查看端口占用进程】如何使用这些工具?详细步骤和参数说明

下面详细介绍如何使用 netstat, sslsof 查看端口占用进程。

方法一:使用 netstat

netstat 命令是许多 Linux 发行版自带的工具。常用的查看端口占用进程的命令组合是:

sudo netstat -tunlp

参数说明:

  • -t: 显示 TCP 协议的连接。
  • -u: 显示 UDP 协议的连接。
  • -n: 以数字形式显示地址和端口号,而不是尝试解析主机名、服务名。这可以加快输出速度,并且避免 DNS 问题。
  • -l: 仅显示正在监听 (Listening) 的套接字。
  • -p: 显示使用套接字的进程的 PID (Process ID) 和程序名称。这个选项通常需要 root 权限才能显示所有进程的信息。

示例:

查看所有监听中的 TCP 和 UDP 端口及其进程信息(可能需要 sudo):

sudo netstat -tunlp

查看特定端口(例如 80)是否被占用:

sudo netstat -tunlp | grep :80

这里使用了管道 |netstat 的输出发送给 grep 命令,grep :80 则过滤出包含 `:80` 的行(即本地地址或远程地址中带有 80 端口的连接,配合 -l 则只看监听在 80 端口的)。

输出示例解读:

sudo netstat -tunlp 的输出大致如下:

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 850/sshd

tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 690/cupsd

tcp6 0 0 :::80 :::* LISTEN 1234/apache2

udp 0 0 0.0.0.0:68 0.0.0.0:* 550/dhclient

  • Proto: 协议类型 (tcp, udp, tcp6, udp6)。
  • Recv-Q / Send-Q: 网络接收/发送队列字节数。
  • Local Address: 本地地址和端口号。`0.0.0.0` 或 `:::` 表示监听所有可用 IP 地址(包括 IPv4 和 IPv6),`:22`、`:631`、`:80` 是监听的端口号。
  • Foreign Address: 远程地址和端口号。`0.0.0.0:*` 或 `:::*` 对于监听状态的套接字表示接受来自任何地址的连接。
  • State: 套接字状态 (LISTEN 表示正在监听传入连接)。
  • PID/Program name: 占用此端口的进程的 PID 及其程序名称。例如,850/sshd 表示 PID 为 850 的 sshd 进程正在监听 22 端口。

方法二:使用 ss

ssnetstat 的现代替代品,推荐优先使用。语法与 netstat 类似。

sudo ss -tunlp

参数说明:

  • -t: 显示 TCP 协议连接。
  • -u: 显示 UDP 协议连接。
  • -n: 以数字形式显示地址和端口。
  • -l: 仅显示监听 (Listening) 套接字。
  • -p: 显示使用套接字的进程的 PID 和程序名称。同样通常需要 root 权限。

示例:

查看所有监听中的 TCP 和 UDP 端口及其进程信息(可能需要 sudo):

sudo ss -tunlp

查看特定端口(例如 443)是否被占用:

sudo ss -tunlp | grep :443

输出示例解读:

sudo ss -tunlp 的输出通常比 netstat 更简洁:

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port

tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:((“sshd”,pid=850,fd=3))

tcp LISTEN 0 50 127.0.0.1:631 0.0.0.0:* users:((“cupsd”,pid=690,fd=7))

tcp6 LISTEN 0 128 :::80 :::* users:((“apache2”,pid=1234,fd=4))

udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:((“dhclient”,pid=550,fd=6))

ss 的输出也包含协议、状态、本地/远程地址等信息。进程信息通常在最后一列的 users:((...)) 部分显示,包含程序名 (`”…”`)、PID (`pid=…`) 和文件描述符 (`fd=…`)。

方法三:使用 lsof

lsof 命令的功能更广泛,可以列出进程打开的各种文件,包括网络套接字。使用 lsof 查看端口占用的优势是它可以非常直接地针对某个特定端口。

sudo lsof -i :端口号

参数说明:

  • -i: 筛选网络连接。
  • :端口号: 指定要查找的端口号。

示例:

查看 80 端口被哪个进程占用:

sudo lsof -i :80

查看 22 端口(SSH 默认端口)被哪个进程占用:

sudo lsof -i :22

查看某个端口(如 5432)是否被 TCP 或 UDP 占用:

sudo lsof -i tcp:5432 (只看 TCP)

sudo lsof -i udp:5432 (只看 UDP)

输出示例解读:

sudo lsof -i :80 的输出大致如下:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

apache2 1234 root 4u IPv6 12345 0t0 TCP *:http (LISTEN)

  • COMMAND: 进程的命令名称 (`apache2`)。
  • PID: 进程 ID (`1234`)。
  • USER: 启动进程的用户 (`root`)。
  • FD: 文件描述符 (`4u` 表示文件描述符 4,u 表示读写模式)。
  • TYPE: 文件类型 (`IPv6` 表示 IPv6 套接字)。
  • DEVICE / SIZE/OFF / NODE: 其他文件相关信息,对于网络套接字不常用。
  • NAME: 网络连接的详细信息 (`*:http` 表示监听所有地址的 http 服务,即端口 80,`(LISTEN)` 表示监听状态)。

方法四:使用 fuser

fuser 命令可以直接输出占用指定文件或端口的进程 PID。如果你只需要知道 PID 而不是详细列表,它非常方便。

sudo fuser 端口号/协议

参数说明:

  • 端口号: 指定要查找的端口号。
  • /协议: 指定协议,可以是 tcpudp

示例:

查找占用 80 端口(TCP)的进程 PID:

sudo fuser 80/tcp

查找占用 53 端口(UDP)的进程 PID:

sudo fuser 53/udp

输出示例解读:

sudo fuser 80/tcp 的输出可能如下:

80/tcp: 1234

这表示 PID 为 1234 的进程占用了 80 端口的 TCP 协议。

【linux查看端口占用进程】怎么处理占用端口的进程?

一旦通过上述工具找到了占用特定端口的进程的 PID(例如 1234),你可以根据需要决定如何处理它:

  1. 确认进程: 使用 ps aux | grep 1234top -p 1234 等命令进一步查看该 PID 对应的进程详细信息,确认它是你想要处理的进程。
  2. 正常停止服务: 如果你知道这个进程是一个正常的系统服务或应用程序,并且希望它停止,最推荐的方式是使用其服务的管理命令。例如,如果它是 Apache web 服务器,可以使用:
    sudo systemctl stop apache2 (对于使用 systemd 的系统)
    或者
    sudo service apache2 stop (对于使用 SysVinit 或 Upstart 的系统)
  3. 强制终止进程: 如果无法通过服务管理命令停止,或者进程无响应,可以使用 kill 命令强制终止它。最常用的信号是 SIGKILL (信号 9),它会立即终止进程,不给进程清理资源的机会,所以应该谨慎使用。
    sudo kill 1234 (发送 SIGTERM 信号,请求进程终止,进程可以捕获此信号进行清理)
    sudo kill -9 1234 (发送 SIGKILL 信号,强制终止进程,进程无法捕获此信号)
    通常先尝试不带 -9kill,如果进程不退出再使用 kill -9

【linux查看端口占用进程】常见问题与注意事项

1. 为什么有时候 PID/Program Name 这一列是空的或显示问号?

这通常是因为你当前的用户没有足够的权限去查看那个进程的信息。由 root 用户或其他用户启动的进程,如果你是普通用户执行 netstat -pss -p,将无法看到它们的 PID 和程序名。使用 sudo 执行命令可以解决这个问题。

2. 为什么我停止了进程,但端口仍然显示被占用(TIME_WAIT 状态)?

当一个 TCP 连接被主动关闭后,发起关闭的一方(通常是服务器,但在某些情况下也可能是客户端)的套接字会进入 TIME_WAIT 状态。这个状态会持续一段时间(通常是几十秒到几分钟,由系统参数控制),目的是确保网络中延迟的数据包能够正常处理,避免新的连接收到旧连接的数据。处于 TIME_WAIT 状态的端口通常不会阻止同一个服务的新实例启动,因为它不处于 LISTEN 状态。如果你确实需要立即重用处于 TIME_WAIT 状态的端口,可以在服务启动时设置 SO_REUSEADDR 或 SO_REUSEPORT 选项(这需要程序本身支持)。

3. 0.0.0.0127.0.0.1 有什么区别?

127.0.0.1 是本地回环地址 (localhost),表示只有在同一台机器上运行的程序才能通过这个地址和端口进行通信。0.0.0.0 表示监听系统上所有可用的网络接口地址(包括 127.0.0.1 和所有外部网络接口的 IP 地址)。如果一个服务监听在 0.0.0.0:80,那么本机和其他网络上的机器都可以访问它;如果监听在 127.0.0.1:80,则只有本机可以访问。

4. 如何查找占用端口范围或所有端口的进程?

使用 netstat -tunlpss -tunlp 不加 grep 就可以列出所有监听中的 TCP 和 UDP 端口及其进程。如果要查找占用某个范围端口的进程,可以结合 awk 或其他文本处理工具,但这会稍微复杂一些。

例如,使用 ss 查找占用 8000 到 9000 之间端口的进程:

sudo ss -tunlp | awk '$5 ~ /:(8[0-9]{3}|9000)/'

这个命令会查找本地地址端口号在 8000-8999 或 9000 的行。

掌握这些工具和方法,你就能有效地诊断和解决 Linux 系统中端口占用的问题。

linux查看端口占用进程