Ruby Rufus调度程序、DaemonKit和陷阱
我用Rufus调度器DaemonKit守护了一个Ruby调度器脚本(使用Rufus),我试图捕获术语或INT信号,让应用程序在退出之前尝试保存状态 DaemonKit有它自己的trap_state(private)方法,它在守护程序脚本之前捕获信号,所以即使我有这个块,它也没有做很多事情Ruby Rufus调度程序、DaemonKit和陷阱,ruby,rufus-scheduler,daemons,Ruby,Rufus Scheduler,Daemons,我用Rufus调度器DaemonKit守护了一个Ruby调度器脚本(使用Rufus),我试图捕获术语或INT信号,让应用程序在退出之前尝试保存状态 DaemonKit有它自己的trap_state(private)方法,它在守护程序脚本之前捕获信号,所以即使我有这个块,它也没有做很多事情 DaemonKit::Application.running! do |config| surprise = Surprise.new(interval, frequency, false) surp
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
所以它非常简单,我需要在开始方法中运行调度器之前配置陷阱进程(在我的例子中是块)。现在感觉不是很聪明,但是下面的代码按预期工作。作为参考,set_trap在DK中是私有的,但public trap方法会覆盖DK启动时附带的默认值
DaemonKit::Application.running! do |config|
surprise = Surprise.new(interval, frequency, false)
config.trap("TERM") { surprise.stop }
config.trap( "INT" ) { surprise.stop }
surprise.start
end
有趣的是,我在创业时看到了这句话,这是我以前没有注意到的
[daemon-kit]: Trapping SIGINT signals not supported on this platform
INT和TERM在查看您自己的答案和粘贴的以下代码时都起作用:
def start
@scheduler = Rufus::Scheduler.new(:lockfile => $lock)
# ...
@scheduler.join # <- NOT NEEDED
end
def启动
@scheduler=Rufus::scheduler.new(:lockfile=>$lock)
# ...
@scheduler.join#很抱歉,rufus scheduler 3.x中没有陷阱(rufus scheduler 2.x有一个,但仅限于其特殊的SignalScheduler实现)。是否确定已到达文件.delete($lock)
行?你确定如果达成协议它会成功吗?在陷阱末端放置一个放置“退出”
。。。狼击剑。@jmettrauh我真蠢,我把DaemonKit和Rufus搞混了。这是DaemonKit陷阱术语,我的朋友,请更新您的解释。提前谢谢@杰米特罗是的,完成了。我也发现了这个问题。我知道,在惊喜#开始
中,您调用调度程序#加入
,它会阻止正在运行的代码,并且以下陷阱从未设置。这就是为什么在这个版本中它可以工作的原因。谢谢!这可能是我在DK之前单独使用鲁弗斯时留下的。我什么时候需要加入线程呢?在一个香草Ruby项目中,你需要这样做。DaemonKit抽象了保持脚本正常运行的需要。它会千方百计让您的流程保持活力和运行。