cronが特定のスクリプトを実行しない問題をデバッグする方法—または他の?
-
03-07-2019 - |
質問
毎日実行したいRailsスクリプトがあります。私は多くのアプローチがあり、cronで作成された 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
毎朝午前4時に cron
で実行するように設定しています。 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
解決
デフォルトでは、cronはその出力を実行したユーザーにメールで送信します。そこを見ることができます。
cronで実行されるスクリプトの出力をリダイレクトすると、サーバー上のランダムなユーザーのローカルメールの代わりにログファイルで結果を確認できるため、非常に便利です。
stdoutとstderrをログファイルにリダイレクトする方法は次のとおりです。
cd /home/deploy/your_app/current; script/runner -e production ./script/my_cron_job.rb >> /home/deploy/your_app/current/log/my_file.log 2>&1
>>
はstdoutをファイルにリダイレクトし、 2>& 1
はstderrをstdoutにリダイレクトするため、エラーメッセージもログに記録されます。
これを行うと、エラーメッセージを調べて、実際に何が起こっているのかを確認できます。
他のヒント
スクリプトがコマンドラインから実行されたときにcronジョブでスクリプトが実行されないことを発見した場合の通常の問題は、対話型セッションにはあるがcronが取得できない環境の一部に依存することです。頻繁に使用される候補には、「パス」があります。環境、そしておそらく" HOME"。
Linuxでは、すべての構成ファイル(/etc/crontab、/etc/crond.{daily、hourly、etc}/*および/etc/cron.d/*)がユーザーrootにのみ書き込み可能であり、シンボリックリンクではありません。そうでない場合、それらは考慮されません。
非ルートおよび/またはシンボリックリンクを許可するには、cronpデーモンに-pオプションを指定します。