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项目

参考资料:


我的猜测是,要么是有什么东西把EventMachine反应堆回路拴住了,阻止它退出,要么是有什么东西在捕获信号

作为前者的一个简单示例,将其放入
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进行精简。谢谢您的详细回答。希望这能给我足够的线索来解决这个问题。