如何通过端口号杀死 Linux 进程
已发表: 2022-10-08要终止 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
:
须藤 dnf 安装 socat
在 Manjaro 上,您需要输入:
sudo pacman -S socat
socat
的语法很简单,如果有点啰嗦的话。 我们需要提供源地址和目标地址。 对于其中的每一个,我们都需要提供协议、IP 地址和端口号。 我们可以将 STDIN 或 STDOUT 替换为源或目标。
此命令在端口 7889、环回 IP 地址 127.0.0.1 上的 TCP 侦听套接字和 STDOUT 之间创建连接。 与号“ &
”在后台运行命令,以便我们保留对命令行的访问权限。
socat tcp-listen:7889,bind=127.0.0.1 标准输出 &
我们将再创建两个连接,以便我们有一小部分使用不同协议的套接字。 我们将创建一个 UDP 连接和一个 SCTP 连接。 命令中唯一改变的部分是协议。
socat udp-listen:7889,bind=127.0.0.1 标准输出 &
socat sctp-listen:9999,bind=127.0.0.1 标准输出 &
相关: TCP 和 UDP 有什么区别?
使用杀死
当然,我们可以使用kill
来终止进程,只要我们知道进程的ID是什么即可。 要查找 PID,我们可以使用lsof
命令。
要列出使用 TCP 协议的端口 7889 上的进程的详细信息,我们使用-i
(互联网地址)选项,如下所示。
lsof -i tcp:7889
这个进程的 PID 是 3141,我们可以继续使用kill
:
须藤杀死 3141
如果我们使用管道,我们可以节省一些精力。 如果我们将lsof
的输出通过管道传输到awk
并告诉awk
搜索包含我们感兴趣的端口(7889)的行并打印该行的第二个字段,我们将隔离 PID。
lsof -i tcp:7889 | awk '/7889/{打印 $2}'
然后,我们可以使用xargs
将awk
的输出通过管道传输到kill
命令中。 xargs
命令接受其管道输入并将其作为命令行参数传递给另一个命令。 我们将xargs
与kill
命令一起使用。
lsof -i tcp:7889 | awk '/7889/{打印 $2}' | xargs 杀死
我们没有得到任何视觉反馈。 在典型的 Linux 方式中,没有消息就是好消息。 如果要检查进程是否已终止,可以再次使用lsof
。
lsof -i tcp:7889
因为lsof
没有报告任何内容,所以我们知道没有这种联系。
我们可以使用 UDP 协议删除进程,只需在前面的命令中将“tcp”替换为“udp”即可。
lsof -i udp:7889 | awk '/7889/{打印 $2}' | xargs 杀死
但是, lsof
不识别 SCTP 协议。
lsof -i sctp:7889
我们可以使用ss
命令来做到这一点。 我们使用-S
(SCTP) 选项搜索 SCTP 套接字,使用-a
(all) 选项搜索所有类型的套接字(侦听、接受、连接等),以及-p
(进程)选项列出使用套接字的进程的详细信息。
ss-树液
我们可以使用grep
和awk
解析该输出。 我们也可以使用grep
和一些 PERL 正则表达式来解析它,但是这种方式更容易理解。 如果您要使用它不止一次或两次,您可能会使用它创建一个别名或 shell 函数。
我们将ss
的输出通过管道传输到grep
并搜索我们的端口号 7889。我们将grep
的输出通过管道传输到awk
。 在awk
中,我们使用-F
(分隔符字符串)选项将逗号“ ,
”设置为字段分隔符。 我们搜索包含“pid=”的字符串,并从该字符串中打印第二个逗号分隔的字段。
ss-树液| grep "7889" | awk -F',''/pid=/{print $2}'
这给了我们字符串“pid=2859”。
我们可以再次将其输入awk
,将字段分隔符设置为等号“ =
”并打印该字符串中的第二个字段,这将是等号后面的文本。
ss-树液| grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=''{打印 $2}'
我们现在已经隔离了进程 ID。 我们可以使用xargs
将 PID 作为命令行参数传递给kill
。
ss-树液| grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=''{打印 $2}' | xargs 杀死
这会杀死在端口 7889 上使用 SCTP 协议套接字的进程。
定影器命令
fuser
命令大大简化了事情。 缺点是它仅适用于 TCP 和 UDP 套接字。 从好的方面来说,这是您需要处理的两种最常见的套接字类型。 fuser
命令已经安装在我们检查的 Ubuntu、Fedora 和 Manjaro 计算机上。
您需要做的就是使用-k
(kill)选项,并提供端口和协议。 您可以使用-n
(命名空间)选项并提供协议和端口,或者使用“正斜杠快捷格式”并将端口号放在首位。
定影器-n tcp 7889
热熔器 7889/udp
终止进程的端口号、协议和 PID 打印在终端窗口中。
首先尝试定影器
它可能会安装在您正在使用的计算机上,并且协议可能是 TCP 或 UDP,因此最简单的方法很可能适合您。