2
* * * * * /bin/bash -l -c 'cd /Users/boris/projects/MyApp/ && rails runner "Resque.enqueue(Place)"'

基本上我需要做以下事情:

  1. 使用 RVM 加载 Ruby
  2. 导航到MyApp目录
  3. 运行以下行:rails runner "Resque.enqueue(Place)

上面的 cron 似乎正在运行,但它使用rails runner产生以下错误 这是怎么回事?

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/dependency.rb:52:in `initialize': Valid types are [:development, :runtime], not nil (ArgumentError)
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:359:in `new'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:359:in `search'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:354:in `gems_size'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:179:in `resolve'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/source_index.rb:95:in `sort_by'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:175:in `each'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:175:in `sort_by'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:175:in `resolve'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:160:in `start'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:128:in `resolve'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:127:in `catch'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/resolver.rb:127:in `resolve'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/definition.rb:151:in `resolve'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/definition.rb:90:in `specs'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/definition.rb:135:in `specs_for'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/definition.rb:124:in `requested_specs'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/environment.rb:23:in `requested_specs'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/runtime.rb:11:in `setup'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler.rb:107:in `setup'
    from /Users/boris/.rvm/gems/ruby-1.9.2-p180/gems/bundler-1.0.12/lib/bundler/setup.rb:6
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:36:in `require'
    from /Users/boris/projects/chaggregator/config/boot.rb:6
    from script/rails:5:in `require'
    from script/rails:5
4

3 回答 3

4

实际上,最好的方法是使用 rvm 包装器。您可以像这样创建包装器:

rvm wrapper ruby-1.9.3-p0@somegemset appname rails 

二进制文件可以是 rails、rake、gem 或您安装的任何其他 ruby​​ 二进制文件。发生的情况是 rvm 创建了一个包装器,该包装器将在执行 rails 命令之前获取正确的 rvm 环境。在系统范围的 rvm 上,包装器通常放置在 /usr/local/rvm/bin/

现在从 cron 你可以这样做:

*/3 * * * * cd /path/to/your/app && appname_rails runner "Resque.enqueue(Place)" -e production

这将 cd 进入您的 app 目录并每 3 分钟执行一次您刚刚创建的 rvm 包装器。此示例基于 rails 3 和生产环境。

于 2012-04-03T18:36:06.373 回答
1

在运行任何 Ruby 代码之前,您需要通过 RVM 获取正确的环境。所以在命令中包含这样的内容:

source /usr/local/rvm/environments/ruby-1.9.2-p180@my-gemset

所以一个潜在的解决方案是:

SHELL=/bin/bash
* * * * * source /{path_to_rvm_environment_for_ruby}@{gemset} && cd /Users/boris/projects/MyApp/ && rails runner "Resque.enqueue(Place)"'
于 2011-05-28T22:42:28.643 回答
0

这里有很多移动的部分,这里有一些关于在你的环境中检查的东西的指针(ruby、rvm、bundle)——发布你的发现,然后从那里开始。

路径与捆绑器的问题,改变还是不改变?

捆绑错误

我猜这些命令在 cron 之外运行良好?如果您以其他用户身份运行 cron 作业,请检查该用户的环境。

于 2011-05-28T22:38:52.700 回答