我在一个在heroku工人身上运行的rake任务中运行rufus调度程序。我经常得到SIGTERM异常,因为正常的heroku重新启动(请参阅heroku dyno博士)。在此过程中,我希望实现上述文档中所示的优雅关闭和关闭rufus调度程序:
trap('TERM') do
scheduler.shutdown(:kill)
exit
end然而,当我试图用这个任务向进程发送SIGTERM时,我得到了错误:
can't be called from trap context是否有任何方法可以在SIGTERM上优雅地关闭rufus调度程序?我使用ruby 2.0,rake 10.0.4,rufus-调度器3.0.2。
不,我不能使用heroku调度程序,因为我需要每分钟运行这个任务;-)。
编辑 (jmettraux)
测试代码:https://gist.github.com/jmettraux/a4c00374f58e9f7affa8
Ruby2.0.0-p247,rufus- Debian /Linux上的调度程序3.0.5
/home/jmettraux/w/rufus-scheduler/lib/rufus/scheduler/job_array.rb:74:
in `synchronize': can't be called from trap context (ThreadError)
from /home/jmettraux/w/rufus-scheduler/lib/rufus/scheduler/job_array.rb:74:in `to_a'
from /home/jmettraux/w/rufus-scheduler/lib/rufus/scheduler.rb:276:in `jobs'
from /home/jmettraux/w/rufus-scheduler/lib/rufus/scheduler.rb:127:in `shutdown'
from t.rb:8:in `block in <main>'
from t.rb:18:in `call'
from t.rb:18:in `sleep'
from t.rb:18:in `<main>'相同的平台,但有Ruby1.9.3-p 392,它会优雅地关闭。
发布于 2014-02-13 21:55:40
好的,它是Ruby2.0特定的(https://www.ruby-forum.com/topic/4411227)
下一个版本的rufus调度程序将包括一个解决方案。
https://github.com/jmettraux/rufus-scheduler/issues/98
谢谢你报道这个问题。
发布于 2014-02-13 22:16:45
您所遇到的问题是由于Thread同步在trap中。我会以这样的方式工作:
p "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
p $$
require 'rufus-scheduler'
s = Rufus::Scheduler.new
trap('TERM') do
$quit = true
end
s.every '10s' do
p :hello
end
s.every '1s' do
if $quit
p :bye
s.shutdown(:kill)
end
end
s.joinshell1:
$ ruby exit_scheduler.rb
"2.0.0-p0"
60580shell2:
$ kill -s TERM 60580shell1:
:byehttps://stackoverflow.com/questions/21733308
复制相似问题