新手问题 rails 运行后台程序

carl · 2012年06月12日 · 最后由 lainuo 回复于 2012年06月12日 · 7530 次阅读

我想在 rails 下开一个后台程序,每隔 10 分钟进行一次一定规模的运算处理,大家知道有什么好的方法吗? 谢谢!

应该是用 Crontab,whenever 只是辅助生成 Crontab 的配置格式

先写个 rake,接着加到一个定时脚本中,后台执行这个脚本

require "rufus/scheduler" require "eventmachine" require [File.dirname(FILE), 'period_env.rb'].join("/")

command = "cd #{RAILS_ROOT_PATH} && #{RAKE_PATH}"

EM.run { scheduler = Rufus::Scheduler.start_new

scheduler.cron '*/10 * * * *' do %x(#{command} everyminute #{RAILS_ENV}) end }

我采用的方式是用这个: https://github.com/bvandenbos/resque-scheduler 比较重。

Crontab 一直困扰我的就是 Ruby 环境变量的问题,尤其是用 RVM 的时候

@huacnlee 像我这样写个配置文件把 RUBY_PATH 指定成 which ruby 可以吗

#5 楼 @huacnlee 用 Loading RVM environment files in shell scripts,非常容易用: https://rvm.io//integration/cron/

#7 楼 @quakewang source 一下 RVM 的文件应该可以的吧?

Crontab + Resque

#8 楼 @huacnlee 是啊,文档里面就是 source 一下 rvm 的 env 文件,步骤分 2 步:

写一个 bash 文件

#!/usr/bin/env bash

# load rvm ruby
source /home/xxxuser/.rvm/environments/ruby-1.9.3-p194

cd /home/xxxuser/rails_project
rails runner "XXXModel.first"

给这个文件 chmod +x,运行测试一下看能够正常跑了,就在 crontab 里面加上这个文件就可以了

@quakewang 这个 source 动作在 crontab 里面直接写会不会有效果呢?

#11 楼 @huacnlee 我记得是不行的,crontab 对于加载 bash,以及 PATH 和普通的 console 登录是不同的处理,而 rvm enviroment 文件里面好像有依赖 bash 和 PATH 的脚本,还是通过在脚本头部添加这句比较可靠: #!/usr/bin/env bash

我们项目用的 rufus

bash -l -c 'command', 显式用 login shell 运行应该会去加 profile 吧

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