杀死在Linux的特定端口上运行的进程
1. 概述
在使用 Linux 时,我们通常会想要终止使用特定端口的进程。
在本教程中,我们将回顾如何通过它使用的端口来识别进程以及如何终止它。
2. 准备我们的例子
在我们开始测试一些用于识别和杀死在端口上运行的进程的策略之前,让我们使用socat 准备一些进程:
$ socat sctp-listen:9999,bind=127.0.0.1 stdout &
[1] 6424
$ socat tcp-listen:9999,bind=127.0.0.1 stdout &
[2] 6431
$ socat udp-listen:9999,bind=127.0.0.1 stdout &
[3] 6438
在这里,我们分别使用端口 9999 和协议 SCTP、TCP 和 UDP 创建了三个进程。
3. 使用fuser命令
fuser 命令是终止进程的好工具。我们只需要使用*-k*参数。
让我们使用 TCP 协议终止该进程:
$ fuser -k 9999/tcp
9999/tcp: 6431
在这里,符号9999/tcp是*-n tcp 9999*的快捷方式。
使用fuser时,我们无法使用 TCP 或 UDP 以外的协议查询进程。
4. 使用kill命令
kill命令 是用于终止进程的常用命令。但是,我们需要首先使用特定端口和协议识别进程的 PID,然后终止它。
在谈论kill命令时,我们要么在谈论程序/bin/kill 要么在shell 内置kill 。无论如何,这两个命令都可以向正在运行的进程发送特定信号。
4.1. lsof命令
lsof 是一个列出进程打开的文件信息的工具。
让我们结合kill和lsof来使用 UDP 协议杀死进程:
$ lsof -i udp:9999 | awk '/9999/{print $2}' | xargs kill
在 lsof 部分,我们使用了*-i参数来使用语法[46][protocol][@hostname|hostaddr][:service|port] 过滤进程。在我们的例子中,我们使用了协议:端口*
此外,我们使用awk 搜索使用端口 9999 的进程并仅打印 PID。然后,使用/xargs 和kill,我们已经能够终止该特定进程。
4.2. ss 和 netstat命令
由于ss 和netstat 列出了使用 SCTP 协议的进程,让我们终止剩下的进程:
$ ss -Slp | grep -Po ':9999\s.*pid=\K\d+(?=,)' | xargs kill
对于ss命令,我们使用了*-l和-p参数来仅显示监听套接字和使用该端口的进程的 PID。此外,我们使用-S*参数来显示 SCTP 套接字。
此外,由于ss的输出格式,我们使用了带有正则表达式的grep ,它只检索字符串pid= 和逗号“ , ”之间的数字。 同样,我们可以使用 netstat的另一种方法:
$ netstat -Slp | grep -Po ':9999\s.*LISTEN.*?\K\d+(?=/)' | xargs kill
在本例中,我们在字符串LISTEN 和字符“ / ”之间搜索了一个数字。
正如我们所见,ss和netstat都支持 DCCP 等其他协议,因此它们非常适合帮助我们拓宽网络的视野。但是,由于不推荐使用netstat,我们应该选择使用ss命令。