【问题标题】:Gracefully stop rufus scheduler on heroku worker优雅地停止 heroku worker 上的 rufus 调度程序
【发布时间】: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 并且可以正常关闭。

【问题讨论】:

标签: ruby heroku rake signals rufus-scheduler


【解决方案1】:

您遇到的问题是由于 trap 中的 Thread 同步造成的。我会这样解决它:

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.join

shell1:

$ ruby exit_scheduler.rb
"2.0.0-p0"
60580

shell2:

$ kill -s TERM 60580

shell1:

:bye

【讨论】:

    【解决方案2】:

    好的,它是 Ruby 2.0 特定的 (https://www.ruby-forum.com/topic/4411227)

    下一个版本的 rufus-scheduler 将包含一个解决方法。

    https://github.com/jmettraux/rufus-scheduler/issues/98

    感谢您报告问题。

    【讨论】:

    猜你喜欢
    • 2014-12-12
    • 2019-11-10
    • 2011-04-25
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2018-09-27
    相关资源
    最近更新 更多