Node-cronを使用して、スケジュールされたジョブを実行しています。 45分ごとにジョブを実行したいが、奇妙な動作をする
これが私が使用しているパターンです
_'00 */45 * * * *'
_
Tue Jun 17 2014 08:17:39 GMT+0000 (GMT)
でスクリプトを開始しました
ジョブが実行された最初の数回は次のとおりです
1. Tue Jun 17 2014 08:45:03 GMT+0000 (GMT)
2. Tue Jun 17 2014 09:00:01 GMT+0000 (GMT)
3. Tue Jun 17 2014 09:45:02 GMT+0000 (GMT)
これは間違いなく、私が期待したり、望んでいるものではありません。私が望むのは、45分ごとにジョブを実行することです。誰でもパターンを手伝ってくれますか?ありがとう:)
node-cron よりもcronに精通していますが、ドキュメントをざっと見てきました。
私がそれを正しく理解している場合、node-cronはcronで使用されるものと同様の構文を使用しますが、追加の「秒」フィールドがあります。したがって、cronジョブには次のものが含まれます。
# min hour mday month wday command
*/15 * * * * some-command
some-command
を15分ごとに実行するようにスケジュールするには、node-cronは同様の構文を使用して実行時間を指定します。
'0 */15 * * * *'
(秒を指定する追加フィールドを使用)、ただし、外部コマンドではなく、指定されたJavaScript関数を実行します。
標準のcronには、45分ごとにジョブを実行することを指定する構文はありません。 0/45 * * * *
を指定すると、1時間に2回、1時間後の0分と45分にジョブが実行されます。 45分ごと(00:00、00:45、01:30、02:15、...、つまり1日に32回)にジョブを実行するには、15分ごとに実行するようにスケジュールする必要があります。次に、現在の時刻を確認するスクリプトを呼び出して、何かを行うかどうかを決定します。
または、ジョブを実行したいすべての時間の完全なリストを作成できます。
0 0 * * * some-command
45 0 * * * some_command
30 1 * * * some_command
15 2 * * * some_command
# 28 lines omitted
このリストを生成するスクリプトを間違いなく書きたいと思います。
(これは、24時間が45分の倍数であるため実行可能です。この方法では、35分ごとに何かを実行できませんでした。)
同様のアプローチがnode-cronでも機能するはずです。 15分ごとに実行するように関数をスケジュールし、現在の時刻を確認して実行するかどうかを決定する関数を呼び出します。たとえば、45を法とした真夜中からの分数がゼロであるかどうかを確認できます。 (スケジューリングが正確でない場合に備えて、わずかな差異を考慮したい場合があります。)
私はこの関数を書くための最良の方法を提案するのに十分なJavaScriptを知りませんが、それは合理的で簡単なはずです。
または、28行を記述して、実行するすべての時間を指定します。
直接的な方法はありませんがあります。ただし、ターゲットスクリプト内でシェルコマンドを使用してスケジュールをインターセプトすることで結果を取得できます。
最初に、15分ごとにスクリプトを実行します。
*/15 * * * * <target_script>
次に、target_script内で、実際のコードの前に次のコードを配置します。
#!/bin/sh
# Exit except at 0:45, 1:30, 2:15, 3:00, 3:45 etc
if ! echo "((`date +%-H`*60)+`date +%-M`)/45" | bc -l | grep "\.0*$" &> /dev/null;
then exit 1;
fi
# Your actual code goes here;
スクリプトをラッパーとして作成し、実際のコマンドを45分ごとに実行するかどうかを決定する必要があります。つまり、0、45、30(= 45 + 45-60)、15(= 30 + 45-60)、0(= 15 + 45-60)です。そのため、スクリプトを実行する時間は0,15,30,45
。
コマンド date +%M
は、シェルスクリプトで役立つ場合があります。
node-reel
を使用できます。これは、より読みやすく、簡単で、素晴らしいですか????。
const reel = require('node-reel')
reel().call(() => {
console.log(Date.now());
}).everyFortyFiveMinutes().run()
私はこれを45秒間隔で試しましたが、うまくいきました
'*/45 * * * * *'
cronr を参照できます。すべてのマクロパターンをサポートし、オンラインデモを提供します cronr-online demo
cron npm moduelを次のように使用します
var cronJob = require('cron').CronJob;
var job = new cronJob({
cronTime:'0 */45 * * * *',
onTick: function(){
var my_date = new Date();
var tomorrow_date = my_date.getFullYear() + "-" + ('0'+(my_date.getMonth()+1)) + "-" + (my_date.getDate()+1)
var condition = [{},{$set: {'plannedDeliveryDate' :tomorrow_date +'T00:00:00.000Z'}}]
dbQuery.updateMany(orderModel, condition, function(err, result){
if(result.nModified == result.n) console.log(err, result)
})
},
start:true,
timeZone:'Asia/Kolkata'
});
job.start();