我在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"相同,意味着它将无法运行其清理/退出程序。