Crond offset programma di cinque minuti


22

È possibile compensare l'esecuzione di uno script cron impostato ogni 5 minuti?

Ho due script, lo script 1 raccoglie alcuni dati da un database e li inserisce in un altro, lo script 2 estrae questi dati e molti altri dati e crea alcuni graziosi report da esso. Entrambi gli script devono essere eseguiti ogni 5 minuti. Voglio compensare lo script 2 di un minuto in modo che possa creare un rapporto dai nuovi dati. Ad esempio, voglio che lo script uno venga eseguito :00, :05, :10, :15 [...]e lo script due da eseguire :01, :06, :11, :16 [...]ogni ora. Gli script non dipendono l'uno dall'altro e lo script 2 deve essere eseguito indipendentemente dal fatto che lo script uno abbia avuto esito positivo o meno. Ma sarebbe utile se i report potessero contenere i dati più recenti. Questo è possibile con cron?

Inviare;
Ho pensato di utilizzare entrambi i comandi in uno script della shell in modo che vengano eseguiti immediatamente uno dopo l'altro, ma questo non funzionerebbe, a volte lo script 1 può rimanere bloccato in attesa di API esterne ecc., Quindi potrebbero richiedere fino a 15 minuti per l'esecuzione, ma lo script 2 deve essere eseguito ogni 5 minuti, quindi farlo in questo modo fermerebbe / ritarderebbe l'esecuzione dello script 2. Se potessi impostarlo in Cron, significherebbe che lo script 2 verrebbe eseguito indipendentemente da ciò che lo script 1 stava facendo

Risposte:


14

È possibile eseguire script ogni volta che si desidera utilizzare cron. Se si desidera eseguire lo script 1 ogni 5 minuti, è possibile iniziare in questo modo:

*/5 * * * * /path/to/script1

Ma questa è davvero solo una scorciatoia per:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Se vuoi eseguire lo script 2 un minuto dopo lo script 1, puoi farlo:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Puoi anche fare questo:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

E poi all'inizio dello script 2, dormi per un minuto:

sleep 60

4
Mettere il sonno nello script stesso è un brutto hack che rende l'esecuzione della sceneggiatura a mano dal prompt doloroso. Esiste un modo meno brutto per hackerarlo rendendo il sonno parte della voce crontab, ma un modo ancora più elegante è semplicemente compensare i lavori usando la corretta notazione crontab, su cui la tua risposta non tocca.
Caleb,

39

Il campo di immissione minuto per crontab accetta un operatore "incrementi di" che è un po 'confuso perché sembra che dovrebbe essere un operatore matematico "diviso per" ma non lo è. Molto spesso vedrai che ha usato qualcosa di simile al seguente. Nota che questo non trova numeri che sono divisibili per cinque ma piuttosto prende ogni quinto elemento da un set:

 */5 * * * * command

Questo dice a cron di abbinare ogni quinto elemento ( /5) dall'insieme di minuti 0-59 ( *) ma puoi cambiare l'insieme in questo modo:

 1-59/5 * * * * command

Questo richiederebbe ogni quinto elemento dal set 1-59, eseguendo il comando ai minuti 6, 11, 16, ecc.

Se hai bisogno di più offset a grana fine di un minuto, puoi hackerarlo usando il comando sleep come parte del tuo crontab in questo modo:

 */5 * * * * sleep 15 && command

Questo eseguirà il tuo lavoro ogni cinque minuti, ma il comando non si avvia effettivamente fino a 15 secondi dopo il minuto. Per i lavori di breve durata in cui essere pochi secondi dopo qualcos'altro fa la differenza ma non si vuole arrivare con un minuto di ritardo, questo è un trucco abbastanza semplice.


1
Questa è una risposta migliore di quella accettata. L'impostazione dell'offset tramite la gamma è molto più pulita della sospensione.
ND Geek,

11

È possibile indicare un fuso orario con il simbolo +. Ad esempio, per eseguire a :01, :06, :11, :16 [...], creare un'attività come

*/5+1 * * * * command

7
Questo non sembra funzionare in alcune versioni di cron
jhoff

1
Quale versione di cron stai usando che supporta questa sintassi? Cronie non sembra supportarlo.
Matthew G

Ho Cronie su CentOS7, quindi non proverò prima questa soluzione.
AnneTheAgile,

1

Questo ha funzionato per me:

1/5 * ? * * *

Dove 1 sono i minuti di offset. Quindi, se si desidera compensare tre minuti:

3/5 * ? * * *

Ho funzionato con le impostazioni di pianificazione di AWS

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.