web-dev-qa-db-fra.com

Exécuter une tâche Cron toutes les 45 minutes avec Node-Cron

J'utilise node-cron pour exécuter des travaux planifiés. Je veux que les travaux soient exécutés toutes les 45 minutes, mais ça agit étrangement

Voici le motif que j'utilise

'00 */45 * * * *'

J'ai commencé mon script à Tue Jun 17 2014 08:17:39 GMT+0000 (GMT)

Voici les deux premières fois où le travail a été exécuté

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)

Ce n'est certainement pas ce que j'attendais ou voulais. Tout ce que je veux, c'est lancer les Jobs toutes les 45 minutes. Quelqu'un peut-il m'aider avec le motif? Merci :)

17
T. Rex

Vous cherchez probablement 

0 */45 * * * *

Les plages sont ici .

  • Secondes: 0-59 
  • Minutes: 0-59 
  • Heures d'ouverture: 0-23 
  • Jour du mois: 1-31 
  • Mois: 0-11 
  • Jour de la semaine: 0-6
39
Ben Fortune

Je connais mieux cron que node-cron , mais j’ai jeté un coup d’œil à la documentation.

Si je comprends bien, node-cron utilise une syntaxe similaire à celle utilisée par cron, mais avec un champ "secondes" supplémentaire. Alors, où un travail cron pourrait avoir:

# min hour mday month wday command
*/15  *    *    *     *    some-command

pour planifier l'exécution de some-command toutes les 15 minutes, node-cron utiliserait une syntaxe similaire pour spécifier l'heure d'exécution:

'0 */15 * * * *'

(avec un champ supplémentaire pour spécifier les secondes), mais il exécute une fonction JavaScript spécifiée, pas une commande externe.

Dans cron standard, aucune syntaxe ne permet de spécifier l'exécution d'un travail toutes les 45 minutes. Une spécification de 0/45 * * * * exécuterait un travail deux fois par heure, à 0 et 45 minutes après l'heure. Pour exécuter un travail toutes les 45 minutes (à minuit, 00h45, 1h30, 2h15, ..., soit 32 fois par jour), vous devez le planifier pour s'exécuter toutes les 15 minutes invoquez ensuite un script qui vérifie l'heure actuelle pour décider de faire ou non quelque chose.

Ou vous pouvez écrire une liste exhaustive de toutes les heures où vous souhaitez exécuter le travail:

 0  0 * * * some-command
45  0 * * * some_command
30  1 * * * some_command
15  2 * * * some_command
# 28 lines omitted

Je voudrais certainement écrire un script pour générer cette liste.

(Ceci est réalisable parce que 24 heures est un multiple de 45 minutes. Vous ne pouvez pas exécuter quelque chose toutes les 35 minutes de cette façon.)

Une approche similaire devrait fonctionner pour node-cron. Planifiez l'exécution de la fonction toutes les 15 minutes et appelez une fonction qui vérifie l'heure actuelle pour décider si elle doit être exécutée. Par exemple, vous pouvez vérifier si le nombre de minutes depuis minuit modulo 45 est zéro. (Vous voudrez peut-être autoriser un léger écart au cas où la planification ne serait pas exacte.)

Je ne connais pas assez bien JavaScript pour suggérer la meilleure façon d'écrire cette fonction, mais elle devrait être relativement simple.

Ou écrivez 28 lignes pour spécifier toutes les heures que vous souhaitez exécuter.

14
Keith Thompson

Il n'y a aucun moyen direct de le faire. Cependant, nous pouvons obtenir le résultat en interceptant la planification à l'aide d'une commande Shell dans le script cible.

Tout d’abord, lancez le script toutes les 15 minutes:

*/15 * * * * <target_script>

Ensuite, dans le target_script, placez le code suivant avant les codes réels:

#!/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;
2
Seff

Vous devez écrire un script en tant que wrapper pour décider si la commande doit être exécutée toutes les 45 minutes. C'est 0, 45, 30 (= 45 + 45 - 60), 15 (= 30 + 45 - 60), 0 (= 15 + 45 - 60). ainsi, les minutes pour exécuter le script doivent être 0,15,30,45.

La commande date +%M peut être utile dans le script Shell.

1
Cody

vous pouvez utiliser node-reel qui est plus lisible, simple et génial ????.

const reel = require('node-reel')

reel().call(() => {
    console.log(Date.now());
}).everyFortyFiveMinutes().run()

https://github.com/shakee93/node-reel

1
shakee93

J'ai essayé avec cela pendant 45 secondes d'intervalle et fonctionne bien

'*/45 * * * * *'

1
SUBHASIS MONDAL

Vous pouvez vous référer à cronr , il prend en charge tous les motifs de macro et fournit une démonstration en ligne cronr - une démonstration en ligne

0
ryu

utiliser Cron NPM quelque chose comme ça

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();
0
KARTHIKEYAN.A