Ruby 瘦不';不响应SIGINT或SIGTERM
Ruby 瘦不';不响应SIGINT或SIGTERM,ruby,linux,thin,sigint,sigterm,Ruby,Linux,Thin,Sigint,Sigterm,bundle exec瘦启动-p 3111提供以下输出: 使用机架适配器 瘦web服务器(v1.2.11代号Bat) 最大连接数设置为1024 收听0.0.0.0:3111,按CTRL+C停止 ^C Ctrl-C不做任何事情(SIGINT)。也不会杀人(SIGTERM) 我找到了一些关于这种行为的参考资料,但没有找到解决方案。问题可能出在eventmachine(与最新的thin捆绑在一起)、ruby 1.9.2-r290或linux内核(Ubuntu 10.4 LTS、2.6.38.3-lin
bundle exec瘦启动-p 3111
提供以下输出:
使用机架适配器
瘦web服务器(v1.2.11代号Bat)
最大连接数设置为1024
收听0.0.0.0:3111,按CTRL+C停止
^C
Ctrl-C不做任何事情(SIGINT)。也不会杀人(SIGTERM)
我找到了一些关于这种行为的参考资料,但没有找到解决方案。问题可能出在eventmachine(与最新的thin捆绑在一起)、ruby 1.9.2-r290或linux内核(Ubuntu 10.4 LTS、2.6.38.3-linode32)中
这发生在我的项目中,但不是一个全新的rails项目
参考资料:
config.ru
并使用thin-p4567start运行:
require 'thin'
require 'sinatra'
require 'eventmachine'
get '/' do
"hello world"
end
run Sinatra::Application
EventMachine.schedule do
trap("INT") do
puts "Caught SIGINT"
EventMachine.stop # this is useless
# exit # this stops the EventMachine
end
i = 0
while i < 10
puts "EM Running"
i += 1
sleep 1
end
end
require'thin'
需要“sinatra”
需要“eventmachine”
获取“/”do
“你好,世界”
结束
运行Sinatra::应用程序
EventMachine.schedule-do
陷阱(“INT”)怎么办
放置“捕获信号”
EventMachine.stop#这没用
#退出#这将停止EventMachine
结束
i=0
当我<10
“他们在跑”
i+=1
睡眠1
结束
结束
如果不捕获SIGINT,您将获得与捕获它并调用EM.stop时相同的行为。EM.stop(至少在纯ruby版本中,您可以使用EVENTMACHINE\u LIBRARY=“pure\u ruby”thin start
运行)设置一个标志,表示已请求停止,该标志在反应堆循环中拾取。如果反应器回路卡在台阶上(如上述情况),则不会退出
因此,有两种选择:
使用上面的解决方法捕获信号并强制退出。这可能会使连接处于不干净的状态,但他们不会称之为“快&脏”(quick&dirty for while;)
您可以将阻塞代码放在线程或光纤中,这将允许反应器继续运行
在代码中查找长时间运行的任务或循环,并将其转换为EventMachine感知。em http request是一个用于外部http请求的强大库,em synchrony还有其他几种协议(用于数据库连接、tcp连接池等)。在上面的示例中,这很简单:EventMachine.add_periodic_timer(1){puts“EM Running”}
在您的实际代码中,这可能更难跟踪,但请查找生成线程并加入它们的任何位置,或者大型循环。当您尝试退出时,分析工具可以帮助显示正在运行的代码,最后,您可以尝试禁用系统和库的各个部分,以找出罪魁祸首。您可以提供精简配置文件和cap配置文件吗?请尝试ctrl+Z
,然后Enter
?您还可以尝试鲜为人知的ctrl-\方法,有时效果会很好。这不是capistrano问题,我已经更新了这个问题。有意思的是,CTRL-Z有效,但这不是解决方案,因为我想停止使用capistrano进行精简。谢谢您的详细回答。希望这能给我足够的线索来解决这个问题。