创建一个脚本来终止特定端口上的进程

创建一个脚本来终止特定端口上的进程

我想创建一个尽可能可移植的 shell 脚本(“POSIX”),它会终止特定端口上的进程。我知道我可以用这个:

portpid() { fstat | grep ":$1" | awk '{print $3}' ;}

然后,我们可以杀死侦听端口 8080 的进程,如下所示:

$ kill $(portpid 8080)

但是我怎样才能把它组合成一个程序,杀死 oneliner 中端口的进程,并将这个脚本作为命名别名添加到我的命令和路径中?

我想它应该看起来像下面这样。

portpid() { fstat | grep ":$1" | awk '{print $3}' ;}

kill $(portpid $1)

我尝试将其放在一起,但它不起作用:

#!/bin/bash
portpid() { fstat | grep ":$1" | awk '{print $3}' ;}    
kill $(portpid $1) 

我正在使用科恩外壳。这是我的第一个 shell 脚本。

答案1

经常听到/读到“它不起作用”,但几乎没有用。

您使用 shebang 进行 bash (#!/bin/bash ),就像使用 korn shell 一样,您的系统上至少存在 /bin/bash 吗?对于这个小脚本,您也可以使用 /bin/ksh。

你所做的将扩展到(用 80 调用)

#!/bin/bash
portpid() { fstat | grep ":80" | awk '{print $3}' ;}    
kill $(portpid 80) 

这不是你想要的。

fstat喂食使用kill的结果

portpid() { fstat | grep ":$1" | awk '{print $3;}' | xargs kill }

其中 xargs 将读取上一个命令的输入并调用kill。

awk 可以做greping,而不是使用

portpid() { fstat |  awk '/'$1'/ {print $3;}' | xargs kill }

您似乎了解 awk 语法,如果端口号位于特定字段(假设为 7),请使用

portpid() { fstat |  awk '$7 ~ /'$1'/ {print $3;}' | xargs kill }

答案2

您可以将 lsof 与 xargs 一起使用并杀死它

killport() { lsof -i ":$1" -t | xargs kill }

或者

 killport() { kill $(lsof -i ":$1" -t)  }

lsof 特别包含一个用于此目的的标志

-t 此选项指定 lsof 应该生成仅包含进程标识符而没有标头的简洁输出 - 例如,以便可以将输出通过管道传输到kill(1)。该选项选择 -w 选项。

相关内容