- 更新日: 2014年11月27日
- Rails
wheneverで/bin/bash: bundle: command not foundエラー
Rails のローカル development 環境で、whenever(cron用gem)を使って rake タスクを実行させようとしたのですけど、エラーに遭遇してちょっと苦労しました。ログに “/bin/bash: bundle: command not found” というエラーが出力され、最初は cron で rake タスクの実行が上手くできなかった。
https://github.com/javan/whenever
— 環境 —
Rails 4.1
whenever 0.9.2
/bin/bash: bundle: command not found エラー
最初 whenever の設定ファイルである、config/schedule.rb に以下のように書いていた。
config/schedule.rb
1 2 3 4 5 6 |
set :output, 'log/crontab.log' set :environment, :development every 1.minutes do rake "my:task" end |
とりあえずテスト用に1分間隔の cron 設定。しかし、これだと上手く rake タスクが実行できず、ログに延々と”/bin/bash: bundle: command not found”が出力される。bundle コマンドが見つからない…ですと。
PATH設定とrbenvの初期化でOK
この類のエラーは過去にも似たようなのに遭遇した経験があったので、原因は PATH か rbenv あたりだろうなぁと推測しつつ調査したところ、すぐに以下の情報に辿り着きました。
Rails cron whenever, bundle: command not found – Stack Overflow
https://github.com/javan/whenever/issues/186
schedule.rb に “env :PATH, ENV[‘PATH’]” を追加するべし、ということらしい。しかし、”env :PATH, ENV[‘PATH’]” 追加だけでは解決せずまた別のエラーが発生。
最終的に以下の記事を発見して解決、めっちゃ助かりました。サイキョウラインさんありがとうございます!rbenv初期化のコードが必要でした。
そう言えば、~/.zshrc に rbenv 初期化のコードを書いた記憶がある。自分の ~/.zshrc を確認したらやっぱりありました。ということで、schedule.rb で env :PATH, ENV[‘PATH’] の後に job_type を追加して、rbenv初期化コードの eval “$(rbenv init -)” が最初に呼ばれるようにする。そして、その job_type を使うようにします。
config/schedule.rb
1 2 3 4 5 6 7 8 |
set :output, 'log/crontab.log' set :environment, :development env :PATH, ENV['PATH'] job_type :rbenv_rake, %q!eval "$(rbenv init -)"; cd :path && :environment_variable=:environment bundle exec rake :task --silent :output! every 1.minutes do rbenv_rake "my:task" end |
whenever の GitHub ページの readme を読んだら、デフォルトの rake 用の job_type は以下のようになっていました。
1 |
job_type :rake, "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output" |
これの先頭に eval “$(rbenv init -)”; を追加したのが、:rbenv_rake という job_type です。この rbenv_rake を使って rake タスクを cron に設定する。これで無事に whenever で設定したとおりに、cronジョブで rake タスクを実行できました。
最後に whenever で使うコマンド等まとめ
whenever でスケジューリングしたジョブを確認。
1 |
$ bundle exec whenever |
crontab に反映させる。
1 |
$ bundle exec whenever --update-crontab |
crontab 確認。
1 |
$ crontab -e |
crontab から削除。
1 |
$ bundle exec whenever --clear-crontab |
wheneverでActiveRecord管理の古いセッション情報レコードを自動で削除 | EasyRamble
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
- 2件のコメント
このエントリーのおかげで、悩んでいた問題が解決しました。ありがとうございます。
jishiha さん、コメントありがとうございます。解決して良かったです!