使用一行命令杀死给定的 tcp 端口号而不是 PID?

使用一行命令杀死给定的 tcp 端口号而不是 PID?

我经常这样做

sudo netstat -lpn |grep :8088

查看输出

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/java

进而

sudo kill -kill 11189

我希望有一个更方便的命令,就像killatport 8088使用 tcp 端口号作为变量,我可以将其作为管道的别名来执行我想要的操作,但是如何从输出中获取 PID 并将其通过管道传输到 kill 命令?我想我可以使用 awk 从 netstat 的输出中获取 PID,但是如何保护并进行精确的端口匹配,以便输入 80 不会匹配 8080 等等?我应该把它做成 C 程序吗?或者已经有这样的小工具了?

答案1

定影器可以这样做:

sudo fuser -KILL -k -n tcp 8088

答案2

命令可以表述如下:

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

解释:

  1. netstat -ltpn

    • l列出了TCP () 上的监听端口 ( )t及其程序 ( p),但不将端口号解析为名称 ( n)。
  2. grep ":1234\b"

    • 这将搜索后面:1234跟有边界 ( \b) 的单词(或数字,在我们的例子中)的结尾。这确保我们不会捕获:12345示例。
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

      • 替代品sub(/regex/,"replacewith", #fieldnumber)
      • 这个正则表达式\/.*
      • 一无所有""
      • 在字段 中$NF,表示最后一个字段(即包含 的字段PID/program
      • 然后打印它print $NF

      正则表达式\/.*匹配文字/及其后面的所有内容,然后我们用任何内容替换它,本质上是删除它,因此该字段中只剩下 PID 号码。

  4. xargs -i kill -kill {}

    • xargs -i是一个程序,它允许你将前一个命令的输出作为另一个命令的输入。我们的命令是,kill -kill {}其中{}表示“管道中前一个命令的输出”,即我们的 PID 编号。

笔记:整个命令可能有点危险,因为您可能会意外地杀死一些您不想要的东西。它可以再多一点净化。只需确保在使用它时获得正确的端口号即可。

如果您想将其变成一个函数,您可以将以下内容添加到您的~/.bashrc

killatport(){
    netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

使用 保存并应用更改source ~/.bashrc。现在,您可以像这样使用该函数:

killatport 8088

相关内容