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_exprは0 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