Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Rufus调度程序、DaemonKit和陷阱_Ruby_Rufus Scheduler_Daemons - Fatal编程技术网

Ruby Rufus调度程序、DaemonKit和陷阱

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

我用Rufus调度器DaemonKit守护了一个Ruby调度器脚本(使用Rufus),我试图捕获术语或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

所以它非常简单,我需要在开始方法中运行调度器之前配置陷阱进程(在我的例子中是块)。现在感觉不是很聪明,但是下面的代码按预期工作。作为参考,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抽象了保持脚本正常运行的需要。它会千方百计让您的流程保持活力和运行。