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
^CCtrl-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