web-dev-qa-db-ja.com

Rails cronいつでも、バンドル:コマンドが見つかりません

1日1回、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

ここで何が起こっているのかはわかりませんが、うまくいきます。

45
Josh Crowder

私は午後中ずっとこれをいじってみましたが、より良い解決策を見つけることができませんでした。ここに私が思いついたものがあります

bundle install --binstubs

そして、実行します

bin/rake daily:stats
1
Josh Crowder

また、schedule.rbファイルの先頭に次の行を追加することにより、PATHがcrontabで終了することを確認できます。

env :PATH, ENV['PATH']

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

上記の解決策がうまくいかない場合は、試してください:

env :GEM_PATH, ENV['GEM_PATH']
59

非常に多くの試行の後、次のように動作するようです

ターミナルから次を入力します

  1. Crontab -eと入力します。これにより、編集のためにcrontabが開きます。次の2行が表示されます。

    # 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で始まる両方の行をコメント化します。

「bundle exec when」コマンドを実行するたびに上記の手順を実行します。そしてそれは動作します。

PATHが環境を誤解させる理由はわかりません。

4
buddy

私の場合、私はちょうど走った:

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

cron job setup doc を参照

crontab -eのbundleコマンドの前にRubyパスのコマンドに新しいソース行を追加しました

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

乾杯!!!

4
Sumit Munot

私はこの問題を嫌います-私もそれを解決しようとして何時間も費やしました。

私のために働くのは追加することです

Rails_ENV=production; source /usr/local/rvm/scripts/rvm;

bundleコマンドの前。

3
cailinanne

その方法でコマンドを実行することにより:/bin/bash -l -c

ログインシェルとしてbashコマンドを起動し、セットアップファイルとして/etc/profile bashファイルをソース(実行)します。そうすることで、このファイルをチェックすると、バンドルへのパスとそもそも他のすべてのコマンドが含まれているため、以前の$PATHを消去するbashコマンドラインが含まれている可能性があります。

この問題を修正するには、$PATHファイルの/etc/profile変数の設定に関連する行を削除するだけです。

1
axzwl

CronファイルのPATH設定を忘れてください。 PATHの設定は機能しません。

Config/schedule.rbで明示的にバンドルするパスを設定します

set:bundle_command、 "/ usr/local/bin/bundle"

1
vanboom

CrontabでGEM_HOMEおよびGEM_PATH環境変数を明示的に設定する必要があると思います。 gem list --localgem environmentのようなものをcronで実行して、出力を確認することもできます。

1
Sebi

これはENV ['PATH']設定されていない問題です。これを修正する最もエレガントな方法は、インストール直後にrvm関連のスクリプトをパスに追加することです。 .bashrcの先頭に次の行を追加します(非対話型シェルが.bashrcにアクセスするときのように、末尾ではなく先頭に[ -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およびsully環境変数を明示的に設定しようとしないでください。

0
Lavixu

あなたはグーグルで見つけた解決策を以下で試すことができます。それは最終的に私のために働きます....あなたとうまくいくはずです.

運用環境で同じものを実装してテストし、それに応じて環境を変更することを確認しました-

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年後に発生しました。実稼働環境でgemのドキュメントに記載されているものを単純なものにする前に使用していたからです。

私はRuby 2.xおよびRails 4.2を0.9.4の最新バージョンで使用します。問題は同じです。

ありがとうございました。

0