如何通过端口号杀死 Linux 进程

已发表: 2022-10-08
显示 bash 提示符的 Linux 笔记本电脑
fatmawati achmad zaenuri/Shutterstock.com

要终止 Linux 进程,您需要它的 ID 或名称。 如果你只知道它正在使用的端口,你还能杀死它吗? 是的,有几种不同的方式。

杀死进程

有时,Linux 进程可能会变得无响应。 它可能会停止正常运行,或者它可能会继续工作但忽略关闭它的请求,或者开始吞噬内存、CPU 或网络带宽。

如何从 Linux 终端杀死进程
相关如何从 Linux 终端杀死进程

无论您的动机是什么,都可以通过 Linux 命令行终止进程。 经典的方法是使用带有您要终止的进程的进程 ID 的 kill 命令。 kill命令有一些近亲。 pkill命令将按名称杀死一个进程,而killall将杀死它可以找到的共享名称的所有进程。

如果您只知道某个进程正在使用您计算机上的某个端口,那么仍然有一些方法可以识别并杀死它。 在网络术语中,“端口”可以表示您插入末端带有插头的电缆的物理连接,例如 CAT5 或 6 网络引线,也可以表示软件端口。

软件端口是网络连接的最后一部分。 设备的 IP 地址可识别计算机或其他网络设备。 计算机内部的应用程序使用不同的端口。 这些提供了另一个级别的粒度。 网络流量已使用 IP 地址到达正确的计算机,并且通过使用端口寻址,可以将其传送到正确的应用程序。

这就像邮件到达酒店,然后被分类并送到适当的房间。 IP地址就像酒店的街道地址,房间号就像端口号。

如果您在端口上看到网络活动并且您不认识生成它的进程,或者它的行为有问题或可疑,您可能想要终止该进程。 即使您只知道端口号,您也可以追踪该进程并将其终止。

使用 socat 创建连接

所以我们有一些连接要杀死,我们将使用socat使用不同的协议创建网络连接。 您需要安装socat 。 要在 Ubuntu 上安装它,请使用以下命令:

 sudo apt install socat 

在 Ubuntu 上安装 socat

在 Fedora 上使用dnf

 须藤 dnf 安装 socat 

在 Fedora 上安装 socat

在 Manjaro 上,您需要输入:

 sudo pacman -S socat 

在 Manjaro 上安装 socat

socat的语法很简单,如果有点啰嗦的话。 我们需要提供源地址和目标地址。 对于其中的每一个,我们都需要提供协议、IP 地址和端口号。 我们可以将 STDIN 或 STDOUT 替换为源或目标。

此命令在端口 7889、环回 IP 地址 127.0.0.1 上的 TCP 侦听套接字和 STDOUT 之间创建连接。 与号“ & ”在后台运行命令,以便我们保留对命令行的访问权限。

 socat tcp-listen:7889,bind=127.0.0.1 标准输出 & 

使用 socat 创建一个监听 TCP 套接字连接

我们将再创建两个连接,以便我们有一小部分使用不同协议的套接字。 我们将创建一个 UDP 连接和一个 SCTP 连接。 命令中唯一改变的部分是协议。

 socat udp-listen:7889,bind=127.0.0.1 标准输出 &
 socat sctp-listen:9999,bind=127.0.0.1 标准输出 & 

使用 socat 创建侦听 UDP 和 SCTP 套接字连接

相关: TCP 和 UDP 有什么区别?

使用杀死

当然,我们可以使用kill来终止进程,只要我们知道进程的ID是什么即可。 要查找 PID,我们可以使用lsof命令。

要列出使用 TCP 协议的端口 7889 上的进程的详细信息,我们使用-i (互联网地址)选项,如下所示。

 lsof -i tcp:7889 

使用 lsof 显示使用特定端口和协议的进程的详细信息

这个进程的 PID 是 3141,我们可以继续使用kill

 须藤杀死 3141

如果我们使用管道,我们可以节省一些精力。 如果我们将lsof的输出通过管道传输到awk并告诉awk搜索包含我们感兴趣的端口(7889)的行并打印该行的第二个字段,我们将隔离 PID。

 lsof -i tcp:7889 | awk '/7889/{打印 $2}' 

将 lsof 的输出通过管道传输到 awk

然后,我们可以使用xargsawk的输出通过管道传输到kill命令中。 xargs命令接受其管道输入并将其作为命令行参数传递给另一个命令。 我们将xargskill命令一起使用。

 lsof -i tcp:7889 | awk '/7889/{打印 $2}' | xargs 杀死

使用管道将 lsof 的输出带入 awk 并从 awk 带入 xargs 并杀死

我们没有得到任何视觉反馈。 在典型的 Linux 方式中,没有消息就是好消息。 如果要检查进程是否已终止,可以再次使用lsof

 lsof -i tcp:7889 

使用 lsof 搜索使用特定端口和协议的进程的详细信息而没有成功

因为lsof没有报告任何内容,所以我们知道没有这种联系。

我们可以使用 UDP 协议删除进程,只需在前面的命令中将“tcp”替换为“udp”即可。

 lsof -i udp:7889 | awk '/7889/{打印 $2}' | xargs 杀死

使用管道将 lsof 的输出带入 awk 并从 awk 带入 xargs 并杀死,用于 UDP 套接字

但是, lsof不识别 SCTP 协议。

 lsof -i sctp:7889 

lsof 不适用于 SCTP 协议

我们可以使用ss命令来做到这一点。 我们使用-S (SCTP) 选项搜索 SCTP 套接字,使用-a (all) 选项搜索所有类型的套接字(侦听、接受、连接等),以及-p (进程)选项列出使用套接字的进程的详细信息。

 ss-树液

使用带有 ss 的 SCTP 套接字打印进程的详细信息

我们可以使用grepawk解析该输出。 我们也可以使用grep和一些 PERL 正则表达式来解析它,但是这种方式更容易理解。 如果您要使用它不止一次或两次,您可能会使用它创建一个别名或 shell 函数。

我们将ss的输出通过管道传输到grep并搜索我们的端口号 7889。我们将grep的输出通过管道传输到awk 。 在awk中,我们使用-F (分隔符字符串)选项将逗号“ , ”设置为字段分隔符。 我们搜索包含“pid=”的字符串,并从该字符串中打印第二个逗号分隔的字段。

 ss-树液| grep "7889" | awk -F',''/pid=/{print $2}' 

使用管道连接ss、grep、awk提取PID字符串

这给了我们字符串“pid=2859”。

我们可以再次将其输入awk ,将字段分隔符设置为等号“ = ”并打印字符串中的第二个字段,这将是等号后面的文本。

 ss-树液| grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=''{打印 $2}' 

使用管道连接ss、grep和awk两次,提取PID

我们现在已经隔离了进程 ID。 我们可以使用xargs将 PID 作为命令行参数传递给kill

 ss-树液| grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=''{打印 $2}' | xargs 杀死

使用带有 ss、grep、awk 和 xargs 的管道来终止 SCTP 套接字进程

这会杀死在端口 7889 上使用 SCTP 协议套接字的进程。

定影器命令

fuser命令大大简化了事情。 缺点是它仅适用于 TCP 和 UDP 套接字。 从好的方面来说,这是您需要处理的两种最常见的套接字类型。 fuser命令已经安装在我们检查的 Ubuntu、Fedora 和 Manjaro 计算机上。

您需要做的就是使用-k (kill)选项,并提供端口和协议。 您可以使用-n (命名空间)选项并提供协议和端口,或者使用“正斜杠快捷格式”并将端口号放在首位。

 定影器-n tcp 7889
 热熔器 7889/udp 

使用 fuser 命令删除使用 TCP 和 UDP 套接字的进程

终止进程的端口号、协议和 PID 打印在终端窗口中。

首先尝试定影器

它可能会安装在您正在使用的计算机上,并且协议可能是 TCP 或 UDP,因此最简单的方法很可能适合您。