我想创建一个尽可能可移植的 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 选项。