我在下面使用Thor创建了一个脚本,就像管理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
当启动ruby script.rb start
时,它会生成两个子进程(总共三个)。我的问题是当我执行ruby script.rb stop
时如何杀死所有进程。我已经在网上看到,在开始时,我应该将pid父进程存储到一个文件中,当停止时,我读取它并杀死。问题是杀死父母不会杀死孩子。所以我可以将所有三个pid保存在文件中,然后逐个删除。
我问自己这是做什么的正确方法,以及我使用start
内部流程的方式是否正确。
答案 0 :(得分: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) }