Rails 如何启动后台进程完成一个定时任务

zqalyc · 2014年02月10日 · 最后由 zqalyc 回复于 2014年02月10日 · 3896 次阅读

需要在指定的时间内查询某些表进行处理,需要写一个后台进程,如何写?

whenever 用的是 cron,好像每次执行任务要新开一个 ruby 进程,需要加载 rails environment。不适合间隔短的定时任务

#1 楼 @saiga 我用的是这个 gem 包:

gem 'rufus-scheduler'

代码:

scheduler.cron '21 16 * * *' do
  puts "ruby"
end

如果这样运行,代码块里也是重新开一个 ruby 进程吗? 还有能查看运行的是哪个进程吗?

定时执行: whenever

ruby 脚本查询表: ActiveRecord

最后 whenever -i 完事.

#2 楼 @zqalyc 看了一下源码,也是开启一个独立的后台进程,不过不同 cron。那个 GEM 只在初始化的时候开启一个常驻进程,通过线程派发执行任务,效率上要好很多。

https://github.com/jmettraux/rufus-scheduler/blob/master/lib/rufus/scheduler.rb#L448

在运行的时候应该会打印 pid 到 lockfile,那个就是 rufus-scheduler 的进程 id

# 指定 lockfile
scheduler = Rufus::Scheduler.new lockfile: '/tmp/scheduler.stat'

以上只供参考,我没用这个 gem

#4 楼 @saiga 谢谢啦,以后要学习看源码了,呵呵

需要 登录 后方可回复, 如果你还没有账号请 注册新账号