Esecuzione di un cronjob con parametri diversi ogni giorno


12

Sono un programmatore e non so molto sui croni, ma voglio sapere se questo è possibile.

Diciamo che ho un array [option1, option2, option3]e uno script che eseguo in NodeJS chiamato script.js. Voglio eseguire questo script ogni giorno all'una di notte. Il croncomando di questo sarebbe:

0 1 * * * node ~/script.js

Bene, ora la parte difficile, voglio ruotare le opzioni ogni giorno, quindi ad esempio lunedì voglio correre node ~/script.js option1, il giorno successivo node ~/script.js option2e così via. Inoltre, voglio essere in grado di aggiungere / rimuovere opzioni quando necessario, ma la rotazione dovrebbe rimanere intatta.

Questo è possibile in qualche modo? So che potrei farlo anche all'interno del nodo, ma preferirei farlo dall'esterno dello script e lasciare lo script così com'è.


2
Consiglierei questo scripting vs cercando di ottenere cron da solo.
earthmeLon

Risposte:


15

Inoltre, voglio essere in grado di aggiungere / rimuovere opzioni quando necessario, ma la rotazione dovrebbe rimanere intatta.

È difficile. Cosa significa che la rotazione rimane intatta dopo la modifica dell'elenco di opzioni? Dopotutto, potresti ricostruire completamente l'elenco, distruggendo qualsiasi indizio su dove ti trovassi.

Quello che probabilmente potresti fare è impostare una directory con i file che rappresentano le tue opzioni (tramite il loro nome file o il loro contenuto). Quindi, ogni volta che il cron job viene eseguito, elencheresti quella directory, ordinando i file in base all'ultima modifica. Prendi la voce più vecchia, touchquel file per cambiare l'ora di modifica all'ora corrente, quindi lo usi per eseguire lo script.

#!/bin/bash
cd ~/script-options
next=$(ls -rt | head -n1)
touch -- "${next}"
node ~/script.js ${next} or $(<"${next}")

Se vuoi, puoi scriverlo in una sola riga anche per cron, anche se sarà più difficile da leggere.

Aggiungere opzioni significa aggiungere nuovi file alla directory delle opzioni. Rimuovere le opzioni significa eliminare i file. In qualsiasi momento, il file più vecchio è quello da eseguire successivamente, quindi nuove opzioni verranno aggiunte alla fine del ciclo, come se fosse appena stato eseguito. Se desideri riordinare le opzioni, puoi toccarle nell'ordine desiderato.


Assolutamente +1 per il modo in cui gestisci la sequenzialità delle opzioni attraverso le "modifiche dell'elenco".
Hagen von Eitzen,

Grazie per la risposta, mi piace e la userò. L'ordine esatto della rotazione non è così importante quando ne aggiungo di nuovi all'elenco. L'unica cosa che conta è che tutti ottengono una corsa 1-2 ogni settimana ogni settimana, e non due nello stesso giorno.
Saif Bechan,

2
$(ls -rt | head -n1)ovviamente interromperà i nomi di file che includono newline, ma a questo scopo probabilmente puoi cavartela semplicemente "non farlo".
cjm,

20

Diciamo che vuoi un'opzione diversa per ogni giorno della settimana. Puoi:

  1. Avere un cron job separato per questi:

    0 1 * * 0 node ~/script.js option1
    0 1 * * 1 node ~/script.js option2
    0 1 * * 2 node ~/script.js option3
    

    eccetera...

  2. Ti hanno bashfornito le opzioni desiderate per te:

    0 1 * * * node ~/script.js case `date +%u` in 0 ) echo option1 ;; 1 ) echo option2 ;; 2 ) echo option3 ;;  esac
    

    (Non ho eseguito quest'ultimo, quindi potrebbe aver bisogno di qualche modifica - ma questa è l'idea generale.)


2
Grazie per le risposte, ma penso che diventerà disordinato. Ho davvero bisogno di definire un array da qualche parte, altrimenti non funzionerà. Non riesco a lavorare con echo option1ecc, perché le mie opzioni possono variare di settimana in settimana. Devo solo farlo nella mia app Node e tenere traccia di quello che ho eseguito per ultimo nel mio db.
Saif Bechan,

13

No, non riesco a pensare a un modo pulito per farlo. Basta scrivere un semplice script wrapper shell che controlla la data e avvia quotidianamente l'applicazione nodo con le opzioni richieste.


+1 la chiave è "nessun modo pulito".
Paolo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.