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
コマンドを実行できるようになった。