使用特定端口查找进程的PID
1. 概述
我们都知道一个端口只能被单个应用程序或服务同时使用。有时我们需要知道哪个进程正在侦听特定端口。
在本教程中,我们将看到在 Linux 中查找侦听特定端口的进程的不同方法。
2. root权限
在 Linux 中,只有root用户或进程所有者才能获取进程的详细信息。
当我们想要检查一个监听特定端口的进程时,我们不知道该进程属于谁。
有了root权限,我们可以获得有关进程的所有必要信息,例如进程标识符 。
因此,我们可能需要以root用户(或sudo)启动我们的网络工具。
3. 使用netstat
过去,它预装在许多 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