杀死while

时间:2017-01-03 11:13:25

标签: bash awk kill lsof

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

这很好用:

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

done;

这个没有:

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

    done;

最后一次产生的错误是:

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

任何想法?感谢。

2 个答案:

答案 0 :(得分:2)

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

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

awk 'NR > 1 { print $2 }'

其中NR是记录(行)编号。

请注意,kill仅向进程发送SIGTERM信号,并且该进程可能仅忽略它。如果您想要终止此流程,请使用kill-9)选项运行-KILL(有关信号代码,请参阅man 7 signal)。

答案 1 :(得分:1)

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

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