5

Cron ジョブを 1 日 1 回、設定した時間に実行するように設定するのに苦労しています。モジュールの構成にあるものは次のとおりです。

<crontab>
    <jobs>
        <sorting_flushcache>
            <schedule><cron_expr>0 16 * * *</cron_expr></schedule>
            <run><model>sorting/observer::flushProductCacheCron</model></run>
        </sorting_flushcache>
    </jobs>
</crontab>

cron ジョブについて私が知っていることから、ローカル タイムゾーンに基づいて午後 5 時に実行する必要があります。ただし、決して機能しません。代わりにcron_exprを設定する* 16 * * *と、1 時間ごとにジョブがスケジュールされます (ご想像のとおり)。

私はコードをたどり、問題を見つけたと思いますが、cron スケジューリングとこれが実際にどのように機能するかについて十分に知らないので、誰かが何が問題なのか、仕事を機能させる方法を理解するのを手伝ってくれることを願っています.

Mage_Cron_Model_Scheduleは獣の頭脳です。cron.phpスクリプトがサーバーの crontab スケジュールによって呼び出されると、このクラスがキャッチして作業を行うイベントをディスパッチします。とりわけ、構成を取り込み、今後の cron ジョブのスケジュールを設定しようとします。内部public function trySchedule($time)で を呼び出しmatchCronExpression、問題の cron 式の一部と、その cron 式の一部に対応する現在の時刻の値を渡します。たとえば、cron_exprの最初の部分(の部分) を現在のタイムスタンプの分と比較します。関数の最後に、次のmatchCronExpressionようなブール値を返します。

return ($num>=$from) && ($num<=$to) && ($num%$mod===0);

私の場合、cron_expr0 16 * * *. */5の部分には範囲やタイプのものがないため、設定した正確な値と現在のタイムスタンプの正確な値を比較しています。これは、このジョブがスケジュールされるべき正確な分にたまたま cron スクリプトを実行した場合にのみ true を返すことを意味します。

繰り返しますが、私は cron の専門家ではありませんが、これは私には正しくないようです。では、cron スケジューラーがスクリプトを実行する正確な時間を予測できない場合、ジョブを 1 日 1 回実行するようにスケジュールするにはどうすればよいでしょうか? 私は何かが欠けていることを本当に望んでいます...誰か助けてくれますか?

-- CRON 設定情報 --

generate schedules every: 5
schedule ahead for: 10
missed if not run within: 20
success history lifetime: 60
failure history lifetime: 600
4

1 に答える 1

3

この問題の「解決策」を見つけたかもしれませんが、これがどのような影響を与える可能性があるかはわかりません。うまくいけば、他の誰かがチャイムを鳴らして確認したり、より良い答えを提供したりできます.

Magento の Cron Config を次のように変更しました。

generate schedules every: 1
schedule ahead for: 5
missed if not run within: 20
history cleanup every: 30
success history lifetime: 60
failure history lifetime: 600

これでうまくいったようです。1 分ごとにスケジュールが生成されるようになったため、1 日 1 回のイベントをスケジュールするウィンドウを見逃すことはありません。

これについて何か考えはありますか?システムが 1 分ごとに cron スケジュールを生成するには多すぎるのではないかと心配しています。処理できるはずですが、確認のためにテストを行う必要があります。

他に同じような経験をした人はいますか?どのように解決しましたか?

于 2012-04-20T17:51:06.153 に答える