4

毎日実行したい 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で実行しています。

だから私の質問は...

  1. これをデバッグするための情報は他にどこで探すことができますか?
  2. これは 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
4

3 に答える 3

7

デフォルトでは、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>&1stderr を stdout にリダイレクトするため、エラー メッセージもログに記録されます。

これを行うと、エラー メッセージを調べて、実際に何が起こっているかを確認できます。

于 2009-03-03T18:44:36.703 に答える
2

コマンドラインからスクリプトを実行すると、cron ジョブでスクリプトが実行されないことを誰かが発見した場合の通常の問題は、対話型セッションが持っているが cron が取得しない環境の一部に依存していることです。いくつかの頻繁な候補は「PATH」環境であり、おそらく「HOME」です。

于 2009-03-03T18:44:20.823 に答える
-1

Linuxでは、すべての構成ファイル(/ etc / crontab、/ etc /crond。{daily、hourly、etc} /*および/etc/cron.d/*)がユーザーrootにのみ書き込み可能であり、シンボリックリンクではないことを確認してください。そうでなければ、それらは考慮されません。

非ルートおよび/またはシンボリックリンクを許可するには、crondデーモンに-pオプションを指定します。

于 2010-09-10T12:38:53.093 に答える