【发布时间】:2014-03-11 02:17:59
【问题描述】:
我在一个运行在 heroku worker 上的 rake 任务中运行 rufus-scheduler。由于定期 heroku dynos 重启,我经常收到 SIGTERM 异常(请参阅heroku dyno docs)。我想实现上述文档中显示的正常关闭并在此过程中关闭 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-scheduler 3.0.2。
附:不,我不能使用 heroku 调度程序,因为我需要每分钟运行一次这个任务 ;-)。
编辑 (jmettraux)
测试代码:https://gist.github.com/jmettraux/a4c00374f58e9f7affa8
Debian GNU/Linux 上的 Ruby 2.0.0-p247、rufus-scheduler 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>'
相同的平台,但使用 Ruby 1.9.3-p392 并且可以正常关闭。
【问题讨论】:
-
请附上完整的错误信息。提前致谢。
-
@jmettraux:感谢编辑!
标签: ruby heroku rake signals rufus-scheduler