2014-06-17 18 views
16

Sto usando node-cron per eseguire processi programmati. Voglio che i posti di lavoro per l'esecuzione ogni 45 minuti, ma il suo comportarsi in modo stranoEsegui cron job ogni 45 minuti con Node-Cron

Ecco il modello che sto utilizzando

'00 */45 * * * *'

ho iniziato il mio script in Tue Jun 17 2014 08:17:39 GMT+0000 (GMT)

Ecco sono i primi un paio di volte il lavoro è stato eseguito

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)

Questo non è sicuramente quello che mi aspettavo e voglio. Tutto ciò che voglio è eseguire i Job ogni 45 minuti. Qualcuno può aiutarmi con lo schema? Grazie :)

risposta

31

probabilmente stai per

0 */45 * * * * 

Gli intervalli sono here.

  • secondi: 0-59
  • Minuti: 0-59
  • Ore: 0-23
  • giorno del mese: 1-31
  • Mesi: 0-11
  • Day di settimana: 0-6
+3

Non è "ogni 45 minuti", ma "ogni ora a 45". – Cody

+0

testato, ma sembra funzionare anche ogni secondo, il che ha senso a causa del primo * Quando avviato a '17: 50: 18' gira a' 18: 00: 01' '18:00:02 'ecc. Ho intenzione di provare 00 al posto del primo * –

+1

ottenuto che funzioni con una leggera regolazione del campo dei secondi, ecco lo schema; '0 */45 * * * *' –

-3

Basta provare questo,

0-23/45 * * * * 
+0

È ogni ora a 0 minuti. – Cody

+0

Mi sento, è da 0 a 23 ore ogni 45 minuti. – Ajit

+0

Penso che la prima colonna sia per i "SECONDI", quindi potrebbe essere 0 t0 23 secondi con un passo di 45 secondi –

1

È necessario scrivere uno script come wrapper per decidere se il comando effettivo deve essere eseguito ogni 45 minuti. Quello è 0, 45, 30 (= 45 + 45 - 60), 15 (= 30 + 45 - 60), 0 (= 15 + 45 - 60). quindi, i minuti per eseguire lo script devono essere 0,15,30,45.

Il comando date +%M può essere utile nello script della shell.

+0

Sto usando una libreria chiamata node-cron, tutto ciò che richiede da me è il giusto cron pattern. Non penso di poter scrivere script per lavorarci, se è possibile, allora non so come. ecco un link https://github.com/ncb000gt/node-cron –

+0

Spiacente, non uso node-cron. Non ne ho mai sentito parlare. Il metodo sopra è per cron. Forse node-cron ha qualche sintassi aggiuntiva che cron non ha. Ho incontrato un problema simile e ho letto il manuale di crontab. Non credo sia possibile per cron fare cose come "ogni due settimane" o "ogni 45 minuti". Quindi, scrivere uno script come wrapper per verificare se eseguire sembra essere l'unica scelta. – Cody

+0

Penso che tu abbia probabilmente l'idea giusta. Ma poiché [node-cron] (https://github.com/ncb000gt/node-cron) pianifica l'esecuzione del codice JavaScript, non i comandi, l'OP dovrà scrivere una funzione JavaScript che controlla se deve essere eseguita. –

10

Sono più familiare con cron rispetto a node-cron, ma ho dato una rapida occhiata alla documentazione.

Se ho capito bene, node-cron utilizza una sintassi simile a quella usata da cron, ma con un campo aggiuntivo "secondi". Allora, dove un job cron potrebbe avere:

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

per pianificare some-command per eseguire ogni 15 minuti, il nodo-cron avrebbe usato una sintassi simile a specificare l'ora di correre:

'0 */15 * * * *' 

(con un ulteriore campo per specificare secondi), ma esegue una funzione JavaScript specificata, non un comando esterno.

Nel cron standard, non esiste alcuna sintassi per specificare l'esecuzione di un processo ogni 45 minuti. Una specifica di 0/45 * * * * eseguiva un lavoro due volte ogni ora, a 0 e 45 minuti dopo l'ora. Per eseguire un lavoro ogni 45 minuti (alle 00:00, 00:45, 01:30, 02:15, ..., ovvero 32 volte al giorno), è necessario programmarlo per l'esecuzione ogni 15 minuti e quindi invoca uno script che controlla l'ora corrente per decidere se fare qualcosa.

Un approccio simile dovrebbe funzionare per node-cron. Pianificare la funzione da eseguire ogni 15 minuti e richiamare una funzione che controlla l'ora corrente per decidere se eseguire. Ad esempio, è possibile verificare se il numero di minuti da mezzanotte modulo 45 è zero. (Potrebbe essere utile consentire una piccola variazione nel caso in cui la pianificazione non sia esatta)

Non conosco JavaScript abbastanza bene da suggerire il modo migliore per scrivere questa funzione, ma dovrebbe essere ragionevolmente semplice.

1

C'è senza via diretta per fare questo. Tuttavia, possiamo ottenere il risultato intercettando la pianificazione utilizzando un comando shell all'interno dello script di destinazione.

In primo luogo, eseguire lo script a ogni 15 minuti:

*/15 * * * * <target_script> 

Poi, all'interno del target_script, inserire il seguente codice prima codici effettivi:

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

uso cron npm moduel qualcosa di simile questo

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

Ho provato con questo per 45 secondi intervallo e lavorando bene

'*/45 * * * * *'

Problemi correlati