编程语言
首页 > 编程语言> > ruby – Thin不响应SIGINT或SIGTERM

ruby – Thin不响应SIGINT或SIGTERM

作者:互联网

bundle exec thin start -p 3111给出以下输出:

Using rack adapter
Thin web server (v1.2.11 codename Bat-Shit Crazy)
Maximum connections set to 1024
Listening on 0.0.0.0:3111, CTRL+C to stop
^C

Ctrl-C不执行任何操作(SIGINT).也没有杀死(SIGTERM).

我发现了一些这种行为的引用,但没有解决方案.问题似乎是在eventmachine(捆绑了最新的thin),ruby 1.9.2-r290或linux内核(Ubuntu 10.4 LTS,2.6.38.3-linode32)中.

它发生在我的项目中,但不是一个全新的rails项目.

参考文献:

> http://groups.google.com/group/thin-ruby/browse_thread/thread/4b7c28e8964b5001?fwc=2

解决方法:

我的猜测是,要么绑定EventMachine反应器循环阻止它退出,要么捕获SIGINT.

作为前者的简单示例,将其放入config.ru并使用瘦-p 4567启动:

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

在不捕获SIGINT的情况下,您将获得与捕获它并调用EM.stop时相同的行为. EM.stop(至少在纯ruby版本中,您可以使用EVENTMACHINE_LIBRARY =“pure_ruby”瘦启动运行)设置一个标志,表示已请求停止,该标记在reactor循环内被拾取.如果反应器回路卡在一个台阶上(如上例所示),那么它就不会退出.

所以有几个选择:

>使用上面的解决方法来捕获SIGINT并强制退出.这可能会使连接处于不干净的状态,但他们并没有快速称之为&什么都不肮脏;)
>您可以将阻塞代码放在线程或光纤中,这将允许反应堆继续运行.
>在代码中查找长时间运行的任务或循环,并将这些转换为EventMachine. em-http-request是一个很好的外部http请求库,而em-synchrony有几个其他协议(用于数据库连接,tcp连接池等).在上面的例子中,这很简单:EventMachine.add_periodic_timer(1){puts“EM Running”}

在您的实际代码中,这可能更难以跟踪,但查找生成线程并加入它们的任何位置,或大循环.当您尝试退出时,分析工具可以帮助显示正在运行的代码,最后您可以尝试禁用系统的各个部分和库来确定罪魁祸首的位置.

标签:linux,ruby,thin,sigint,sigterm
来源: https://codeday.me/bug/20190521/1148228.html