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

要终止 Linux 进程,您需要它的 ID 或名称。如果你只知道它正在使用的端口,你还能杀死它吗?是的,有几种不同的方式。
杀死进程
有时,Linux 进程会变得无响应。它可能会停止正常运行,或者它可能会继续工作但忽略关闭请求,或者开始吞噬内存、CPU 或网络带宽。
无论您的动机是什么,都可以通过 Linux 命令行终止进程。经典方法是使用带有要终止进程的进程 ID 的 kill 命令。 kill
命令有一些近亲。 pkill
命令将根据名称终止一个进程,killall
将终止它能找到的共享名称部分的所有进程。
如果您对某个进程的了解只是它正在使用您计算机上的一个端口,那么仍然有一些方法可以识别并终止它。在网络术语中,“端口”可以表示物理连接,您可以在其中插入末端带有插头的电缆,例如 CAT5 或 6 网线,也可以表示软件端口。
软件端口是网络连接的最后一部分。设备的 IP 地址标识计算机或其他网络设备。计算机内部的应用程序使用不同的端口。这些提供了另一个粒度级别。网络流量已使用 IP 地址到达正确的计算机,并且通过使用端口寻址,它可以传送到正确的应用程序。
这就像邮政邮件到达酒店,然后被分拣并送到相应的房间。 IP地址就像旅馆的街道地址,房间号就像端口号。
如果您在端口上看到网络活动,但您不认识生成它的进程,或者它的行为有问题或可疑,您可能想要终止该进程。即使您只知道端口号,您也可以追踪进程并将其终止。
使用 socat 创建连接
为了让我们有一些连接要终止,我们将使用 socat
使用不同的协议创建网络连接。你需要安装 socat
。要在 Ubuntu 上安装它,请使用以下命令:
sudo apt install socat

在 Fedora 上使用 dnf
:
sudo dnf install socat

在 Manjaro 上你需要输入:
sudo pacman -S socat

socat
的语法虽然有点冗长,但很简单。我们需要提供源地址和目标地址。对于其中的每一个,我们都需要提供协议、IP 地址和端口号。我们可以将 STDIN 或 STDOUT 替换为源或目标。
此命令在端口 7889 上的 TCP 侦听套接字、环回 IP 地址 127.0.0.1 和 STDOUT 之间创建连接。符号“&
”在后台运行命令,因此我们保留对命令行的访问权限。
socat tcp-listen:7889,bind=127.0.0.1 stdout &

我们将再创建两个连接,以便我们有一小部分使用不同协议的套接字。我们将创建一个 UDP 连接和一个 SCTP 连接。命令中唯一改变的部分是协议。
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &

使用 Kill
当然,我们可以使用kill
来终止进程,只要知道进程的ID是多少即可。要查找 PID,我们可以使用 lsof
命令。
要列出端口 7889 上使用 TCP 协议的进程的详细信息,我们使用 -i
(互联网地址)选项,如下所示。
lsof -i tcp:7889

这个进程的 PID 是 3141,我们可以继续使用 kill
:
sudo kill 3141
如果我们使用管道,我们可以节省一些精力。如果我们将 lsof
的输出通过管道传输到 awk
并告诉 awk
搜索包含我们感兴趣的端口(7889)的行,并且打印该行的第二个字段,我们将隔离 PID。
lsof -i tcp:7889 | awk '/7889/{print $2}'

然后,我们可以使用 xargs
将 awk
的输出通过管道传输到 kill
命令。 xargs
命令获取其管道输入并将其作为命令行参数传递给另一个命令。我们将使用 xargs
和 kill
命令。
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill

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

因为 lsof
没有报告任何东西,所以我们知道没有这样的联系。
我们可以删除使用 UDP 协议的进程,只需在我们之前的命令中将“tcp”替换为“udp”即可。
lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill

但是,lsof
无法识别 SCTP 协议。
lsof -i sctp:7889

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

我们可以使用 grep
和 awk
解析该输出。我们也可以使用 grep
和一些 PERL 正则表达式来解析它,但这种方式更容易理解。如果你打算不止一次或两次使用它,你可能会从中创建一个别名或 shell 函数。
我们会将 ss
的输出传输到 grep
并搜索我们的端口号 7889。我们会将 grep
的输出传输到 grep
代码>awk。在 awk
中,我们使用 -F
(分隔符字符串)选项将逗号“,
”设置为字段分隔符。我们搜索一个字符串包含“pid=”,并打印该字符串中的第二个逗号分隔字段。
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}'

这给了我们字符串“pid=2859”。
我们可以再次将其通过管道传输到 awk
中,将字段分隔符设置为等号“=
”并打印 that 字符串中的第二个字段,这将是等号后面的文本。
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'

我们现在已经隔离了进程 ID。我们可以使用 xargs
将 PID 作为命令行参数传递给 kill
。
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill

这会终止在端口 7889 上使用 SCTP 协议套接字的进程。
fuser 命令
fuser
命令大大简化了事情。缺点是,它只适用于 TCP 和 UDP 套接字。从好的方面来说,这是您需要处理的两种最常见的套接字类型。我们检查过的 Ubuntu、Fedora 和 Manjaro 计算机上已经安装了 fuser
命令。
您需要做的就是使用 -k
(kill) 选项,并提供端口和协议。您可以使用 -n
(命名空间)选项并提供协议和端口,或者使用“正斜杠快捷格式”并将端口号放在前面。
fuser -n tcp 7889
fuser 7889/udp

终止进程的端口号、协议和 PID 打印在终端窗口中。
首先尝试定影器
它可能会安装在您正在使用的计算机上,并且协议可能是 TCP 或 UDP,因此最简单的方法很可能适合您。