我正在尝试创建一个 bash 函数,该函数应该杀死使用 中指定的某些端口的所有进程port_array
。kill-port
如果我自己用端口调用该函数,例如使用kill-port "80";
.但是如果我在 for 循环中调用它,我会收到一些奇怪的错误kill
:
Usage:
kill [options] <pid> [...]
Options:
<pid> [...] send signal to every <pid> listed
-<signal>, -s, --signal <signal>
specify the <signal> to be sent
-l, --list=[<signal>] list all signal names, or convert one to a name
-L, --table list all signal names in a nice table
-h, --help display this help and exit
-V, --version output version information and exit
For more details see kill(1).
这是代码:
#!/bin/bash
port_array=( 5057 5061 5056 );
function kill-ports () {
ports=( "$@" )
for i in "${ports[@]}";
do
kill-port $i;
done
};
function kill-port () {
lsof -i tcp:"$1" | awk 'NR!=1 {print $2}' | xargs kill;
}
kill-ports "${port_array[@]}";
我可能正在监督我的错误,但如果有人能告诉我这里的问题是什么,我将不胜感激。
问候,
塞拉斯
答案1
kill-ports() {
for port in "$@"; do fuser -n tcp "$port" -k -TERM; done
}
(在这种情况下你绝对不需要引号,但使用它们总是好的,否则你会收到人们的抱怨/编辑。)
答案2
感谢@StéphaneChazelas 的评论,有一个解决方案:
“做就是了:
lsof -ti "tcp:$1" | xargs -r kill
,
这就是-t
目的(并-r
告诉参数如果没有参数,则不运行该命令。那是为了GNUxargs。其他一些实现如自由BSD自动执行此操作)”
最后看起来像这样还有效(我也进行了一些清理):
#!/bin/bash
port_array=( 5057 5061 5056 );
kill-ports() {
for port in "$@";
do
kill-port "$port";
done
};
kill-port () {
lsof -ti "tcp:$1" | xargs -r kill;
}
kill-ports ${port_array[@]};
编辑:
@PSkocik 的解决方案是在 @StéphaneChazelas 评论之后发布的,但也工作得很好:
#!/bin/bash
port_array=( 5057 5061 5056 );
kill-ports() {
for port in "$@"; do fuser -n tcp "$port" -k -TERM; done
}
kill-ports ${port_array[@]};
答案3
尝试附加 -9 来杀死
lsof -i tcp:"$1" | awk 'NR!=1 {print $2}' | xargs kill -9;