kill 在 while 循环中不起作用

kill not working in while loop

我想在 while 循环中终止 lsof 给出的所有进程。

这很好用:

lsof -i tcp | grep -v iceweasel | awk '{ print  }' | while read -r line
do
    echo "$line"

done;

这个没有:

lsof -i tcp | grep -v iceweasel | awk '{ print  }' | while read -r line
    do
        kill "$line"

    done;

最后一次产生的错误是:

./kill.all.sh: line 6: kill: PID: arguments must be process or job IDs

有什么想法吗?谢谢。

不要重新发明轮子。杀死所有使用 tcp 的进程,除了 iceweasel:

kill $(lsof -c ^iceweasel -a -i tcp -t)

问题在于 lsof -i tcp 的输出包含 header,其 PID 项最终传递给 kill 命令(kill PID ) 从而导致错误。

为无头输出使用 -t 选项,或者使用 AWK 忽略第一行:

awk 'NR > 1 { print  }'

其中 NR 是记录(行)号。

注意kill只向进程发送SIGTERM信号,进程可能只是忽略它。如果你想确定终止进程,运行 kill-9 (-KILL) 选项(请参阅 man 7 signal 了解信号代码)。