我想在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
任何想法?感谢。
答案 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)