Contents

使用特定端口查找进程的PID

1. 概述

我们都知道一个端口只能被单个应用程序或服务同时使用。有时我们需要知道哪个进程正在侦听特定端口。

在本教程中,我们将看到在 Linux 中查找侦听特定端口的进程的不同方法。

2. root权限

在 Linux 中,只有root用户或进程所有者才能获取进程的详细信息。

当我们想要检查一个监听特定端口的进程时,我们不知道该进程属于谁。

有了root权限,我们可以获得有关进程的所有必要信息,例如进程标识符

因此,我们可能需要以root用户(或sudo)启动我们的网络工具。

3. 使用netstat

netstat 命令是*net-tools *包的成员。

过去,它预装在许多 Linux 发行版中。但是,net-tools软件包自 2011 年以来一直没有更新。

由于缺乏对现代 Linux 内核特性 的支持等原因,net-tools* 包已经过时。

也就是说,netstat本身仍然被广泛使用,所以让我们来看看它如何提供帮助。

首先,让我们看一个netstat命令的示例输出:

root# netstat -ltnup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:17600         0.0.0.0:*               LISTEN      1293/dropbox
tcp        0      0 127.0.0.1:17603         0.0.0.0:*               LISTEN      1293/dropbox
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      575/sshd
tcp        0      0 127.0.0.1:9393          0.0.0.0:*               LISTEN      900/perl
tcp        0      0 :::80                   :::*                    LISTEN      9583/docker-proxy 
tcp        0      0 :::443                  :::*                    LISTEN      9571/docker-proxy
udp        0      0 0.0.0.0:68              0.0.0.0:*                           8822/dhcpcd
...

使用ltnup 选项, netstat向我们显示了上面示例中使用的所有端口。

让我们看看这些选项的含义:

  • l – 只显示监听套接字
  • t – 显示 TCP 连接
  • *n –*以数字形式显示地址
  • u – 显示 UDP 连接
  • p - 显示进程 ID/程序名称

如果我们查看上面的输出,最后一列正是我们要查找的内容:侦听特定端口的 PID 和进程名称。

我们可以简单地将netstat输出通过管道传递给grep 命令,以获取单个端口上的进程信息。

例如,让我们看看哪个进程在监听 22 端口:

root# netstat -ltnup | grep ':22'
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      575/sshd

4. 使用ss

在上一节中,我们讨论了net-tools包已被弃用。 ss 命令是netstat命令的替代品。

现在让我们看看如何使用ss命令查看哪个进程正在监听 22 端口:

root# ss -ltnup 'sport = :22'
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=575,fd=3))

如果我们检查选项,我们会发现我们传递给ss命令的选项与我们传递给netstat的选项相同。

唯一的区别是我们使用ss实用程序的状态过滤器而不是额外的grep进程来过滤输出。

netstat命令的输出类似,预期的进程信息也位于最后一列。

5. 使用lsof

lsof 命令可以列出 Linux 系统中所有打开的文件。

我们可以使用lsof命令通过-i :port_number*选项使用特定端口查找进程*:

root# lsof -i :22
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd       575 root    3u  IPv4   19373      0t0  TCP *:ssh (LISTEN)

上面输出中的前四列告诉我们侦听端口 22 的进程名称及其 PID、所有者和文件描述符。

我们可以将多个-i :port传递给lsof*命令以找出侦听各种端口的进程*:

root# lsof -i :22 -i :68
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd       575 root    3u  IPv4   19373      0t0  TCP *:ssh (LISTEN)
dhcpcd    8822 root   10u  IPv4   49601      0t0  UDP *:bootpc

6. 使用fuser

fuser 实用程序显示哪些进程正在使用命名文件、套接字或文件系统。它包含在*psmisc * 包中,并且默认预装在许多现代 Linux 发行版中。

我们可以使用它来查看在特定端口上运行的进程的信息。再次让我们找出正在处理的侦听 TCP 端口 22 的 PID:

root# fuser 22/tcp
22/tcp:                575

上面的输出非常简单。我们知道 PID 为 575 的进程正在侦听 TCP 端口 22。

但是,它并没有告诉我们有关进程的详细信息,例如,进程 575 的名称是什么?谁拥有流程?等等。

如果我们想获得有关该过程的更多详细信息,我们可以将*“-v”*选项传递给 fuser 命令以获得详细输出:

root# fuser -v 22/tcp
                     USER        PID ACCESS COMMAND
22/tcp:              root        575 F.... sshd

使用fuser命令,我们还可以一键查看多个 TCP 或 UDP 端口上的运行进程信息:

root# fuser -v 22/tcp 68/udp
                     USER        PID ACCESS COMMAND
22/tcp:              root        575 F.... sshd
68/udp:              root       8822 F.... dhcpcd