OSSのタスク管理ツール「Redmine」を会社で使っており、ある処理を自動処理させようとcronでbundleコマンドを実行させる設定をおこなったのだが、「command not found」のエラーに悩まされた。

今回はこの問題の解決法を紹介する。

エラーの現象

cronに記述した設定内容がこちらで、毎日8:30にリマインダーメールを指定ユーザーへ送信するというものだ。

30 8 * * * cd /var/www/html/redmine ; bundle exec rake redmine:send_reminders days=3 users=1 RAILS_ENV=production >> /tmp/cron.log 2>&1

後半の部分は/tmp/cron.logにログを出力する設定。

指定時刻になってもメールが送信されなかったので、ログを確認すると以下のエラーログが記載されていた。

/bin/sh: bundle: command not found

なお、cronからではなく普通にコマンドを実行すると正常に機能した。

bundle exec rake redmine:send_reminders days=3 users=1 RAILS_ENV=production

コマンドをフルパスで実行する

どうやらcronからコマンドを実行する際は、コマンドのフルパスを記述すると正常に動作するらしく、まずはbundleコマンドのフルパスを調べてみることに。

$ which bundle
/usr/local/bin/bundle

ここで返ってきたパスをcron側で記述する。

30 8 * * * cd /var/www/html/redmine ; /usr/local/bin/bundle exec rake redmine:send_reminders days=3 users=1 RAILS_ENV=production >> /tmp/cron.log 2>&1

これでcronからbundleコマンドを実行できるようになった。