【问题标题】:Kill all pid files in a folder杀死文件夹中的所有pid文件
【发布时间】:2013-01-23 20:22:38
【问题描述】:

我有一个充满 .pid 文件的文件夹。每个都有一个 resque worker 的 PID。如何从命令行杀死该文件夹中的每个 PID?

【问题讨论】:

    标签: bash unix command-line resque pid


    【解决方案1】:

    前导填充会导致错误。使用sed 's/^ *//g' 删除前导间距/填充:

    ps -e -o pid,command | grep '[r]esque-[0-9]' | sed 's/^ *//g' | cut -d ' ' -f 1 |  xargs -L1 kill -s QUIT
    

    【讨论】:

    • 这是真的。如果您的 PID 循环并且您有不同长度的 PID(3 位与 4 或 5),则接受的答案将失败并为您提供所有空白 PID。当它确实发生时很难检测到,所以一定要把那个 sed 替换在那里!
    【解决方案2】:

    虽然问题是答案,但认为有很多很棒的方法可以

    在 linux 中做一些任务,以展示 linux 的强大功能

    这是怎么回事

    pgrep ruby | xargs ps | grep [r]esque | awk '{print $1}' | xargs kill -9 
    

    注意:pgrep 在 MAC-OS 中不受支持,只是认为对某些人有用

    【讨论】:

      【解决方案3】:

      根据docs,它说要使用:

      ps -e -o pid,command | grep [r]esque-[0-9] | cut -d ' ' -f 1 | xargs -L1 kill -s QUIT
      

      注意:这会按名称查找它们,而不是使用.pid 文件。

      另外,QUIT 信号会优雅地杀死它们。如果你想强行杀死他们,请改用TERM

      【讨论】:

      • 我最终使用了 God gem (godrb.com) 来控制我的流程,就像我最初应该拥有的那样。
      【解决方案4】:
      cat folder/*.pid | xargs kill
      

      应该这样做吗?

      如果需要指定信号,例如KILL,那么

      cat folder/*.pid | xargs kill -KILL
      

      如果您的 pidfiles 缺少换行符,这可能会更好:

      ( cd folder &&
      for pidfile in *.pid; do echo kill -QUIT `cat $pidfile`; done
      )
      

      【讨论】:

      • 您可能想要使用QUIT 信号。根据docs:“QUIT - 等待孩子完成处理然后退出”
      • @SamBaumgarten 如果你使用TERM 信号,它应该强制停止所有线程。
      • @SamBaumgarten 根据docs,它说使用:ps -e -o pid,command | grep [r]esque-[0-9] | cut -d ' ' -f 1 | xargs -L1 kill -s QUIT 按名称查找它们,而不是使用 PID。
      • @cyfur01 完美,效果很好。如果您将其发布为答案,我可以接受它
      【解决方案5】:

      运行命令:

      kill `cat folder/*.pid`
      

      如果 PID 文件没有换行符,那么以下应该可以工作:

      for f in folder/*.pid; do kill `cat "$f"`; done
      

      【讨论】:

      • 我遇到了与@mtndesign 的答案相同的问题。 “当我运行它时,我得到一个包含所有 pid 的字符串;但是没有空格。例如,如果 pid 是 5220 和 5395。它会尝试终止 id 为 52205395 的进程”
      【解决方案6】:

      运行这个 - 使用反引号:

      kill -9 `cat /path/*.pid`
      

      【讨论】:

      • 当我运行它时,我得到一个包含所有 pid 的字符串;但是没有空格。例如,如果 pid 为 5220 和 5395。它会尝试终止 id 为 52205395 的进程
      • 可能不会。我只是将它传递给 Resque
      • 嗯,很有趣。你能试试这个吗:for i in `ls`; do kill $i; done.
      • 在 ls; do kill $i; done 中运行 for i 时,我会收到完成命令的提示(a ">")。删除 -9 没有帮助
      • @mtndesign 我知道这是一个切线(而且很挑剔),但是使用ls 来进行for 循环是a bad idea。 @hrunting 的循环使用更安全的语法。
      猜你喜欢
      • 2013-11-12
      • 2014-11-24
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多