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分間隔の 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初期化のコードが必要でした。

rbenvとwheneverとrakeと。サイキョウライン

そう言えば、~/.zshrc に rbenv 初期化のコードを書いた記憶がある。自分の ~/.zshrc を確認したらやっぱりありました。ということで、schedule.rb で env :PATH, ENV[‘PATH’] の後に job_type を追加して、rbenv初期化コードの eval “$(rbenv init -)” が最初に呼ばれるようにする。そして、その job_type を使うようにします。

config/schedule.rb

whenever の GitHub ページの readme を読んだら、デフォルトの rake 用の job_type は以下のようになっていました。

これの先頭に eval “$(rbenv init -)”; を追加したのが、:rbenv_rake という job_type です。この rbenv_rake を使って rake タスクを cron に設定する。これで無事に whenever で設定したとおりに、cronジョブで rake タスクを実行できました。

最後に whenever で使うコマンド等まとめ

whenever でスケジューリングしたジョブを確認。

crontab に反映させる。

crontab 確認。

crontab から削除。

wheneverでActiveRecord管理の古いセッション情報レコードを自動で削除 | EasyRamble

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!