怎样通过端口号杀死 Linux 进程

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

杀死进程

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

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

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

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

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

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

使用 socat 创建连接

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

sudo apt install socat

上 Fedora 利用 dnf

sudo dnf install socat

安装socat Fedora

在 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 stdout &

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

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

socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &

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

TCP和UDP有什么区别?

使用杀死

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

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

lsof -i tcp:7889

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

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

sudo kill 3141

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

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

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

然后我们可以通过管道输出 awk 进入 kill 命令使用 xargs. 这 xargs command 接受其管道输入并将其作为命令行参数传递给另一个命令。 我们将使用 xargskill 命令。

lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill

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

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

lsof -i tcp:7889

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

因为 lsof 没有报告任何东西,我们知道没有这种联系。

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

lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill

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

然而, lsof 不识别 SCTP 协议。

lsof -i sctp:7889

lsof 不适用于 SCTP 协议

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

ss -Sap

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

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

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

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

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

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

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

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

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

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

ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill

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

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

定影命令

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

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

fuser -n tcp 7889
fuser 7889/udp

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

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

首先尝试定影器

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