ruby - Rufus-Scheduler、DaemonKit 和陷阱

标签 ruby rufus-scheduler daemons

我用 Rufus-Scheduler DaemonKit 守护了一个 Ruby 调度程序脚本(使用 Rufus),我试图捕获 TERM 或 INT 信号,让应用程序在退出前尝试保存状态。

DaemonKit 有自己的 trap_state(私有(private))方法,它在守护程序脚本之前捕获信号,所以即使我有这个 block ,它也没有做太多事情。

DaemonKit::Application.running! do |config|

  surprise = Surprise.new(interval, frequency, false)
  surprise.start

  config.trap( 'SIGINT' ) do #tried INT and TERM as well
    puts 'Exiting'
    surprise.stop
    File.delete($lock)
  end
end

作为副作用(可能是我的实现中的错误?),在 sigterm 之后,.rufus 锁定文件仍然存在

现在 ctrl-c 的行为是这样的

[daemon-kit]: DaemonKit (0.3.1) booted, now running surprise
log writing failed. can't be called from trap context
[daemon-kit]: Running signal traps for INT
log writing failed. can't be called from trap context
[daemon-kit]: Running shutdown hooks
log writing failed. can't be called from trap context
[daemon-kit]: Shutting down surprise

开始方法是一个非常简单的计划

def start

@scheduler = Rufus::Scheduler.new(:lockfile =>  $lock)

@scheduler.every '1d', :first_at => @first, :overlap => false do |job|
  ... # some work
end

 @scheduler.join
end

def stop
  # save state
  @scheduler.shutdown
end

最佳答案

查看您自己的答案,以及您粘贴的以下代码:

def start
  @scheduler = Rufus::Scheduler.new(:lockfile =>  $lock)
  # ...
  @scheduler.join # <- NOT NEEDED
end

DaemonKit 的 DaemonKit::Application.running! block 实际上永远不会结束运行,因此您可以安全地跳过在任何线程上调用 #join

我们应该努力使这个用例更加清晰,因为我希望看到它在这种工作中得到更广泛的使用。

关于ruby - Rufus-Scheduler、DaemonKit 和陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286839/

相关文章:

sinatra - 未定义的方法 `haml' 在来自计划作业的 Pony 邮件中渲染 haml 时

ruby - 由 Rufus Scheduler 触发的 Sinatra 事件

python - 在python中连接两个守护进程

ruby-on-rails - 双重执行代码

ruby - 如何在 Ruby 1.8.7 中创建具有特定时间的 Time 对象?

ruby - Ruby 中的对象赋值

Ruby 守护进程软停止

ruby-on-rails - 需要手动要求 gem

ruby - Dashing - 未初始化常量 Nokogiri 异常

ruby - 守护进程不会重新启动?