Rails cron随时,bundle:找不到命令

时间:2012-02-28 12:55:27

标签: ruby-on-rails cron whenever

我试图在每天执行rake任务时使用。我得到这个错误

/bin/bash: bundle: command not found
/home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find bundler (>= 0) amongst [minitest-1.6.0, rake-0.8.7, rdoc-2.5.8] (Gem::LoadError)
        from /home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
        from /home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems.rb:1210:in `gem'
        from /home/app/.rvm/gems/ruby-1.9.2-p180/bin/bundle:18:in `<main>'

这是我的crontab

# Begin Whenever generated tasks for: /home/af/www/app/releases/20120216172204/config/schedule.rb
PATH=/home/af/.rvm/gems/ruby-1.9.2-p180@global/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

0 0 * * * /bin/bash -l -c 'cd /home/af/www/app/releases/20120216172204 && rvm 1.9.1-p180; RAILS_ENV=production /home/af/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1'

# End Whenever generated tasks for: /home/af/www/app/releases/20120216172204/config/schedule.rb

我不知道为什么它不起作用。如果我运行命令:

cd /home/af/www/app/releases/20120216172204 && rvm 1.9.1-p180; RAILS_ENV=production /home/af/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1

它工作正常,不知道这里发生了什么。

16 个答案:

答案 0 :(得分:59)

您还可以通过将以下内容放在schedule.rb文件的顶部来确保您的PATH在crontab中结束:

env :PATH, ENV['PATH']

https://groups.google.com/forum/#!msg/whenever-gem/yRLt3f2jrfU/Exu3xfCo8DAJ

如果上述解决方案不适合您,请尝试:

env :GEM_PATH, ENV['GEM_PATH']

答案 1 :(得分:4)

经过这么多尝试后,以下似乎有效

从终端

键入以下内容
  1. 输入crontab -e 这将打开crontab进行编辑。您将看到如下两行:

    # cron clears out environment variables, but Rubber.root/script/rubber uses
    # "rvm do default" to run, so no longer any need to setup ruby env vars here,
    # all we need is PATH
    PATH=/<path to bundle>/bundle/ruby/1.9.1/bin:/usr/local/rvm/gems
    

    # Begin Whenever generated tasks for: /mnt/wamjoke-production/releases/20120912$
    PATH=/<path to bundle>/shared/bundle/ruby/1.9.1/bin:/usr/local/rvm/gems
    
  2. 注释掉以PATH开头的两行。

  3. 每当运行“bundle execnever”命令时,请执行上述步骤。它有效。

    不知道为什么PATH会误导环境。

答案 2 :(得分:4)

就我而言,我刚跑了:

rvm env --path -- ruby-version[@gemset-name]

参考cron job setup doc

为ruby路径的命令添加了新的源代码行 在crontab -e

中的捆绑命令之前
source /usr/local/rvm/environments/ruby-1.9.3-p392;

现在命令如下:

<强>之前:

0 4 * * * cd /home/current && bundle exec rake my_rake RAILS_ENV=production

<强>后:

0 4 * * * cd /home/current && source /usr/local/rvm/environments/ruby-1.9.3-p392; bundle exec rake my_rake RAILS_ENV=production

干杯!!!

答案 3 :(得分:3)

我讨厌这个问题 - 我花了好几个小时试图解决它。

对我有用的是添加

RAILS_ENV=production; source /usr/local/rvm/scripts/rvm;
在捆绑命令之前

答案 4 :(得分:1)

我认为您应该尝试在crontab中显式设置GEM_HOME和GEM_PATH环境变量。您还可以尝试通过cron运行gem list --localgem environment之类的内容并检查输出。

答案 5 :(得分:1)

忘记cron文件中的PATH设置。设置PATH不起作用。

在config / schedule.rb中明确设置捆绑路径

set:bundle_command,“/ usr / local / bin / bundle”

答案 6 :(得分:1)

通过以下方式执行命令:/bin/bash -l -c

您正在启动bash命令作为登录shell,它将源(执行)/etc/profile bash文件作为安装文件。通过这样做,如果您检查此文件,它可能有bash命令行删除您不想要的先前$PATH,因为它包含您的包的路径以及所有其他命令。< / p>

要解决此问题,您只需删除与在$PATH文件中设置/etc/profile变量相关的行。

答案 7 :(得分:0)

我整个下午都玩这个,但找不到更好的解决方案。以下是我的想法

bundle install --binstubs

然后运行

bin/rake daily:stats

答案 8 :(得分:0)

这是ENV ['PATH']未设置的问题。解决此问题的最优雅方法是在安装后立即将rvm相关脚本附加到路径。将以下行添加到.bashrc的开头(开始而不是结束,因为.bashrc由非交互式shell访问时,行[ -z "$PS1" ] && return抛出错误,后续行不会执行。

PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

并且不要尝试显式设置PATH和卑鄙的环境变量。

答案 9 :(得分:0)

你可以尝试下面我在google搜索时找到的解决方案,最终对我有用....希望能与你合作。

我在生产中实施并测试了相同的产品,确保相应地改变环境 -

set :output, "{your path on the server}/log/cron_log.log"
 set :environment, :production
 env :PATH, ENV['PATH']
 job_type :rbenv_rake, %q!eval "$(rbenv init -)"; cd :path && :environment_variable=:environment bundle exec rake :task --silent :output!

祝你好运,这个问题发生在3年之后,因为我之前使用的只是简单的生产宝石文档。

我使用Ruby 2.x和Rails 4.2,每当0.9.4最新版本。如果问题的性质相同,它也应该与早期版本一起使用。

谢谢。

答案 10 :(得分:0)

对于使用rbenv的用户,可以使用随附的垫片/home/username/.rbenv/shims/bundle

0 0 * * * /bin/bash -l -c 'cd /home/af/www/app/releases/20120216172204 && RAILS_ENV=production /home/af/.rbenv/shims/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1'

答案 11 :(得分:0)

在 2021 年,我找到了一个基本的解决方案,只需在 schedule.rb

之上添加
 env :PATH, ENV['PATH']
 set :output, "log/cron_log.log"
 set :runner_command, "rails runner"

来自:

https://github.com/javan/whenever/issues/665

答案 12 :(得分:0)

我通过打印环境变量解决了这个问题

printenv

查找与 Rails 相关的那些。一个是 gems 的路径,另一个是 GEM_HOME 并在 cron 中添加以下两个命令:

PATH=$PATH:/home/petr/gems/bin GEM_HOME=/home/petr/gems program_executable

答案 13 :(得分:0)

同样在 2021 年,在 schedule.rb 中添加这个对我有用:

set :job_template, "bash -l -c 'PATH=#{ENV['PATH']} && :job'"
<块引用>

默认情况下,所有作业都使用 bash -l -c 'command...' (https://github.com/javan/whenever) 运行

所以我在开始时在 PATH 中包含 bash 包含 ENV['PATH'],现在从正确的 rbenv 调用 rails。

答案 14 :(得分:-1)

对于现代修复,请在capistrano deploy.rb中添加此行,

set :whenever_command, "bundle exec whenever"

答案 15 :(得分:-5)

[root @ smbserver current] #crontab -e

02 22 * * 1-5 /bin/bash -l -c  /shell/day.sh 
30 14 * * 0 /bin/bash -l -c  /shell/week.sh