我有一个Ruby应用程序,该应用程序源于按需线程,然后进行系统调用以执行本机二进制。
我想在本机通话完成之前中止此通话。
我尝试使用所有选项,例如kill
,raise
和terminate
,但似乎没有任何帮助。
这就是我要做的:
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