[Ruiby 1.9] [Windows]将Ctrl-C中断信号发送到生成的子进程

时间:2016-07-12 04:43:19

标签: ruby windows process interrupt

我在Windows上运行Ruby 1.9.3中的主脚本。它将启动另一个作为守护进程运行的Ruby脚本,执行自己的操作,然后通过发送" INT"来结束守护进程。信号。主脚本和守护进程不进行任何数据交换。

守护程序本身可以作为独立运行,我们使用Ctrl-C终止它。这是准备信号的部分:

def setup_ctrl_c_to_quit
     Thread.new do
        trap("INT") do
          puts "got INT signal"
          exit
        end
        while true
          sleep 1
        end
      end
end

我目前无法启动主脚本并终止守护程序。目前,我可以通过生成和分离启动守护进程:

def startDaemon
  @daemonPID = spawn("ruby c:/some_folder/daemon.rb", :new_pgroup=>true, :err=>:out)
  puts "DaemonPID #{@daemonPID}"
  daemonDetatch = Process.detach(@daemonPID)
  puts "Detached Daemon . Entering sleep...."
  sleep 15
  puts "Is daemon detached thread alive? => #{daemonDetatch.alive?}"
  puts "Attempt to kill daemon...."
  Process.kill( "INT", @daemonPID )
  sleep 5
  puts "Is daemon detached thread still alive? => #{daemonDetatch.alive?}"
end

理想情况下,最后一个puts语句应该显示daemonDetatch.alive吗?是假的。实际上,daemonDetatch.alive不仅仅是?到最后仍然是真的,守护进程也可以在任务管理器和其他第三方应用程序(如Process Explorer)中运行。

我遇到的第一个问题是使用spawn(...)函数。 official documentation表示:new_pgroup"对于子进程"上的Process.kill(:SIGINT,pid)是必需的。发送它确定子进程是否成为新组。我已经用这个参数切换了,但它似乎没有什么区别。

另外,我打算尝试this solution,这涉及到使用win32-process gem。我只是想知道是否还有其他解决方案。

[编辑]

我已验证在主脚本中获取的守护程序的PID,守护程序本身(使用$$)和Process Explore,它们都是相同的。

我从其他许多人那里得到建议只是使用" taskkill / f"终止守护进程这确实会结束守护进程,但守护进程无法捕获守护进程#34;或" KILL"捕获信号的方式与#34; INT"相同,意味着它将无法运行其清理/退出程序。

0 个答案:

没有答案