【发布时间】:2014-12-04 21:08:07
【问题描述】:
我使用 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
启动方法是一个非常简单的时间表
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)线路已到达吗?你确定如果达到它会成功吗?在你的陷阱末端放置一个puts 'Exited'... 狼栅栏。 -
@jmettraux 呃,我很愚蠢,我把 DaemonKit 和 Rufus 混为一谈了。这是 DaemonKit 捕获 TERM,我的错
-
那么请更新您的解释。提前致谢!
-
@jmettraux 是的,完成了。我也发现了问题。
标签: ruby rufus-scheduler daemons