【问题标题】:Unix: How to kill a list of processes (PID) based on the lsof command?Unix:如何根据 lsof 命令杀死进程列表 (PID)?
【发布时间】:2016-07-20 05:19:41
【问题描述】:

我想终止与 tcsh shell 中的进程相关的 PID 列表。我运行了以下命令:

> losf <file> | awk '{print($2)"'

该命令将显示 PID 列表。

pid1

pid2

...

然后我运行以下命令来杀死这些 PID。

> kill -9 `lsof <file> | awk'{print($2)}'`

kill 命令被执行时,终端只是莫名其妙地挂起而没有杀死任何PID。然后我不得不恢复到一个一个地杀死那些PID。

因此,有没有办法按照上面的说明做我想做的事情?谢谢。

【问题讨论】:

    标签: unix kill lsof


    【解决方案1】:

    xargs 是标准实用程序,用于对从标准输入读取的每个给定行执行操作。你可以这样使用它:

    > lsof <file> | awk 'print {$2}' | xargs -I '{}' kill {}
    

    【讨论】:

    • 感谢您提供此解决方案,这一班轮正在为我工​​作,这正是我一直在寻找的。我编辑了您对以下内容的答案,因为原始答案有语法错误。 Original: awk 'print {$2}'Edited: awk '{print($2)}'
    【解决方案2】:

    也许你可以试试 for i in (lsof &lt;file&gt;); echo "pkill"$i 或者你也可以尝试一些像 lsof &lt;file&gt; &gt; pkill 虽然我不抱任何希望..

    【讨论】:

    • 谢谢你,但我无法尝试这个,因为我使用的是没有“for”命令的 tcsh shell。我已经设法改用 foreach 命令。
    【解决方案3】:

    我设法使用以下 foreach 方法解决了这个问题:

    > foreach id (`lsof <file> | awk '{print($2)"'`)
    foreach? kill -9 $id
    foreach? end
    

    我不确定是否有更好的方法来做到这一点,而无需编写用于此类用途的脚本。

    【讨论】:

      【解决方案4】:

      你有没有遇到过fuser 命令。
      选项 -k 将杀死所有打开指定文件的进程。

      fuser -k -TERM /home/rolf/fs3/fs3.db /home/rolf/fs2.db
      /home/rolf/fs3/fs3.db:  4026  4058
      /home/rolf/fs2.db:   3996
      

      默认情况下会发送 KILL,但您可以将其更改为 TERM,例如使用 -SIGNAL 选项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多