猛击 |端口终止循环失败

猛击 |端口终止循环失败

我正在尝试创建一个 bash 函数,该函数应该杀死使用 中指定的某些端口的所有进程port_arraykill-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;

相关内容