我试图创建一个可以从命令行启动的ruby应用程序,它有两件事:运行一个连续的作业(loop
与sleep
,它运行一些操作[远程提要解析])与一个线程和sinatra在第二个线程中。我的代码(简体)看起来像这样:终止终止所有线程
require 'sinatra'
class MyApp < Sinatra::Base
get '/' do
"Hello!"
end
end
threads = []
threads << Thread.new do
loop do
# do something heavy
sleep 10
end
end
threads << Thread.new do
MyApp.run!
end
threads.each { |t| t.join }
上面的代码实际上做了它的工作非常好 - 西纳特拉的应用程序是在4567端口开始可用和do something heavy
任务beeing解雇每次10秒。但是,我无法杀死那个脚本。
我正在运行它与ruby app.rb
但用ctrl + c杀死它不起作用。它杀死了sinatra线程,但第二个仍在运行,为了停止脚本,我需要关闭终端窗口。
我试图杀死SIGNINT所有的线程,但它如预期
trap "SIGINT" do
puts "Exiting"
threads.each { |t| Thread.kill t }
exit 130
end
你能不能帮我这也没有工作?提前致谢。
您是否看到“puts”的输出Exiting“'? – Humza
不幸的是,我不 – mbajur
这显然意味着你的'陷阱'不工作。作为一个附注,我建议通过'thread.exit'而不是'Thread.kill(thread)'来退出线程 - 它更简洁。 – Humza