如何终止子过程,作为终止创建该线程的线程的一部分



我有一个Ruby应用程序,该应用程序源于按需线程,然后进行系统调用以执行本机二进制。

我想在本机通话完成之前中止此通话。

我尝试使用所有选项,例如killraiseterminate,但似乎没有任何帮助。

这就是我要做的:

class Myserver < Grape::API
@@thr = nil
  post "/start" do
    puts "Starting script"
    @@thr = Thread.new do
     op=`sh chumma_sh.sh`
     puts op
    end
    puts @@thr.status
  end
  put "/stop" do
    @@thr.terminate
    @@thr.raise
    Thread.kill(@@thr)
    puts @@thr.status
  end
end

该线程似乎是在进行IO操作的过程中进入睡眠状态的,但是我如何杀死线程,以使其创建的所有子过程均被终止而不附加到root。

为脚本做ps-ef | grep返回PID,我可以尝试Process.kill pid,但想知道是否有更好的选择。

我目前没有选择脚本如何执行脚本,因为它是继承库的一部分。

使用ps是我发现有效的唯一方法。如果您也想杀死子线,则可以使用类似的东西:

def child_pids_recursive(pid)
  # get children
  pipe = IO.popen("ps -ef | grep #{pid}")
  child_pids = pipe.readlines.map do |line|
    parts = line.split(/s+/)
    parts[2] if parts[3] == pid.to_s && parts[2] != pipe.pid.to_s
  end.compact
  pipe.close
  # get grandchildren
  grandchild_pids = child_pids.map do |cpid|
    child_pids_recursive(cpid)
  end.flatten
  child_pids + grandchild_pids
end
def kill_all(pid)
  child_pids_recursive(pid).reverse.each do |p|
    begin
      Process.kill('TERM', p.to_i)
    rescue
      # ignore
    end
  end
end

最新更新