【发布时间】:2017-01-03 11:13:24
【问题描述】:
我想在 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
有什么想法吗?谢谢。
【问题讨论】:
-
“不起作用”是什么意思?
kill向进程发送 SIGTERM 信号,进程可以用这个信号做它想做的事(它甚至可以忽略它)。如果您想确定终止进程,请发送 SIGKILL:kill -9 $pid或kill -KILL $pid -
对不起,我忘记了错误信息:
-
./kill.all.sh:第 6 行:kill:PID:参数必须是进程或作业 ID
-
然后对
lsof使用-t选项。lsof -i tcp的输出包含标题,您将PID字符串传递给kill。或者用awk 'NR > 1 { print $2 }'忽略第一行 -
正如@RuslanOsmanov 所说,问题在于 lsof 标头。只需修改 awk 命令即可解决问题。但是,我仍然建议使用 xargs 而不是 while 循环(看起来很适合我):
lsof -i tcp | grep -v iceweasel | awk 'NR > 1 { print $2 }' | xargs -i kill -9 {}。你甚至可以用一个命令直接杀死他们lsof -i tcp | grep -v iceweasel | awk 'NR > 1 { print $2 }' | xargs kill -9