我用Rufus scheduler DaemonKit对Ruby调度程序脚本进行了守护(使用Rufus),并试图捕获TERM或INT信号,让应用程序在退出之前尝试保存状态。
DaemonKit有自己的trap_state(private)方法,它在守护程序脚本之前捕获信号,因此即使我有这个块,它也不会做太多的工作。

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

start方法是一个非常简单的时间表
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!块实际上从未完成运行,因此您可以安全地跳过在任何线程上调用#join
我们应该努力使这个用例更加清晰,因为我希望看到它在这类工作中得到更广泛的应用。

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

10-13 04:50