5

我在下面有一个脚本,它使用Thor像 rake 任务管理一样运行ARGV

#!/usr/bin/env ruby
require "thor"

class Run < Thor

  desc "start", "start script"
  def start
      p1 = fork{ loop... }
      p2 = fork{ loop... }

      # 3 processes running

      Process.detach(p1)
      Process.waitpid(p1)

  end

  desc "stop", "stop script"      
  def stop
    # kill all 3 pids
  end

end

Run.start

当 start 时ruby script.rb start,它会生成两个子进程(总共三个)。我的问题是如何在我执行时杀死所有进程ruby script.rb stop。我在网上看到,在启动时,我应该将 pid 父进程存储到一个文件中,当停止时,我读取它并杀死它。问题是杀死父母不会杀死孩子。所以我可以将所有三个pid都保存在文件中,然后一一杀死。

我在问自己什么是正确的方法,以及我在内部处理流程的方式start是否正确。

4

1 回答 1

0

如果你知道你的父 pid,你可以像这样找到并杀死所有的孩子:

# Find child pids, works on Linux / OSX
def child_pids(pid)
  pipe = IO.popen("ps -ef | grep #{pid}")
  pipe.readlines.map do |line|
    parts = line.strip.split(/\s+/)
    parts[1].to_i if parts[2] == pid.to_s and parts[1] != pipe.pid.to_s
  end.compact
end

# kill -9 every child
child_pids(parent_pid).each { |pid| Process.kill('TERM', pid) }
于 2013-06-16T11:15:44.280 回答