我使用Rufus-Scheduler守护了一个Ruby调度程序脚本(使用Rufus) DaemonKit并试图捕获TERM或INT信号让应用程序尝试在退出前保存状态。Rufus-Scheduler,DaemonKit和陷阱
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
启动方法是一个非常简单的时间表
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
对不起,但rufus-scheduler 3.x中没有陷阱(rufus-scheduler 2.x只有一个,但仅限于其特殊的SignalScheduler实现)。 你确定你的'File.delete($ lock)'行已经到达吗?你确定它会成功,如果达到?在你的陷阱的末端放置一个'放置'退出'...狼击剑。 – jmettraux 2014-10-09 21:15:32
@jmettraux呃我很笨,我把DaemonKit和Rufus混在一起。它是DaemonKit陷印TERM,我的不好 – blackbird 2014-10-10 01:56:35
请更新你的解释。提前致谢! – jmettraux 2014-10-10 01:59:39