【问题标题】:kill not working in while loop杀死不在while循环中工作
【发布时间】: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 $pidkill -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

标签: bash awk kill lsof


【解决方案1】:

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

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

awk 'NR > 1 { print $2 }'

其中NR 是记录(行)号。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 矫枉过正 !!:-D 你的语法不起作用,但是 lsof -c ^icewease -i tcp -t | kill {} 做得很好
    • lsof -c ^icewease -i tcp -t | xargs -i 杀死 {}
    猜你喜欢
    • 2018-04-04
    • 2013-02-10
    • 2012-10-22
    • 1970-01-01
    • 2016-01-11
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多