毎日実行したい Rails スクリプトがあります。多くのアプローチがあり、クローン化されたアプローチが一部の人に嫌われていることは知っていますがscript/runner
、それは私のニーズを満たしているようです.
ただし、スクリプトがスケジュールどおりに実行されません。
私のアプリケーションは/data/myapp/current
にあり、スクリプトは にありscript/myscript.rb
ます。次のように、問題なく手動で実行できますroot
。
/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb
これを行うと、特別なログ ファイル ( log/myscript.log
) が期待どおりに記録されます。
Tue Mar 03 13:16:00 -0500 2009 Starting to execute script...
...
Tue Mar 03 13:19:08 -0500 2009 Finished executing script in 188.075028 seconds
cron
毎朝午前 4 時に 実行するように設定しています。root
の crontab:
$ crontab -l
0 4 * * * /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb
実際、今朝も実行しようとしたようです。
$ tail -100 /var/log/cron
...
Mar 2 04:00:01 hostname crond[8894]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb)
...
Mar 3 04:00:01 hostname crond[22398]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb)
...
しかし、ログ ファイルにエントリがなく、更新すべきデータが更新されていません。ログ ファイルのアクセス許可 (テストとして) は、グローバルに書き込み可能に設定されていました。
$ ls -lh
total 19M
...
-rw-rw-rw- 1 myuser apps 7.4K Mar 3 13:19 myscript.log
...
CentOS 5で実行しています。
だから私の質問は...
- これをデバッグするための情報は他にどこで探すことができますか?
- これは SELinux の問題でしょうか? このエラーを解決するために設定または変更できるセキュリティ コンテキストはありますか?
ありがとうございました!
アップデート
ポールとルークの両方に感謝します。環境の問題であることが判明しstderr
、ログ ファイルにキャプチャすることで、エラーを見つけることができました。
$ cat cron.log
/usr/bin/env: ruby: No such file or directory
$ head /data/myapp/current/script/runner
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/runner'
特定の Ruby 実行可能ファイルをコマンドに追加すると、うまくいきました。
$ crontab -l
0 4 * * * /usr/local/bin/ruby /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb >> /data/myapp/current/log/cron.log 2>&1