2014-12-10 11 views
7

Mi trovo in una situazione in cui un cron job che pensavo fosse in esecuzione ogni 55 minuti è in realtà in esecuzione a 55 minuti dopo l'ora e nella parte superiore dell'ora. In realtà, non è un cron job, ma è un PHP scheduling application che usa la sintassi di cron.Come funzionano i "passaggi" di Cron?

Quando chiedo a questa applicazione di pianificare un lavoro ogni 55 minuti, crea una riga crontab come la seguente.

*/55 * * * * 

Questa linea crontab finisce non esecuzione di un lavoro ogni 55 minuti. Invece un lavoro viene eseguito a 55 minuti dopo le ore e alla fine dell'ora. Non lo desidero. Ho eseguito questo però un cron tester, e verifica che il comportamento indesiderato sia corretto comportamento cron.

Questo mi porta a cercare cosa significa in realtà lo /. Quando ho guardato il cron manual ho imparato la barra indicato "passi", ma il manuale di per sé un po 'confusa su quello che significa

valori passo può essere utilizzato in combinazione con le gamme. Seguendo un intervallo con "<number>" specifica salta il valore del numero attraverso l'intervallo. Ad esempio, "0-23/2" può essere utilizzato nel campo ore per specificare l'esecuzione del comando ogni altra ora (l'alternativa nello standard V7 è "0,2,4,6,8,10,12,14,16,18,20,22"). I passaggi sono consentiti anche dopo un asterisco, quindi se si desidera dire" ogni due ore ", basta usare '*/2'.

descrizione del manuale ('specifica salti di valore del numero attraverso la gamma') è un po 'vago, e 'l'esempio ogni due ore' è un po' ingannevole (che è probabilmente ciò che ha portato al bug nell'applicazione)

Così, due domande:

  1. In che modo il programma unix cron utilizza le informazioni "step" (il numero dopo una barra) per decidere se saltare un lavoro? (divisione modulare? Se sì, su cosa? Con quali condizioni decidere una corsa "vera" e quali decisioni no? O è qualcos'altro?)

  2. È possibile configurare un processo cron di unix da eseguire ogni " N "minuti?

+0

@shellter Non voglio eseguirlo a soli 55 dopo l'ora, voglio eseguirlo ogni 55 minuti. Correre alle 55 dopo le ore sarebbe una volta all'ora. Più alla mia domanda, voglio sapere come funziona la funzione "steps" e se è possibile dire "ogni N minuti" indipendentemente da cosa sia N. –

+0

Per il down-vote/closer - questa domanda riguarda il modo in cui la logica di programmazione di cron è ** programmata **, a supporto della scrittura di software contro un pacchetto PHP che utilizza la logica cron. Sembra abbastanza in tema –

risposta

8

valori passaggio può essere utilizzato in combinazione con gamme. Seguendo un intervallo con "<number>" specifica salta il valore del numero nell'intervallo. Per esempio , è possibile utilizzare "0-23/2" nel campo delle ore per specificare l'esecuzione del comando ogni ora (l'alternativa nello standard V7 è "0,2,4,6,8,10,12,14,16,18,20,22"). I passaggi sono consentiti anche dopo un asterisco , quindi se vuoi dire "ogni due ore", usa semplicemente "*/2".

Il "campo" essendo definito in questa sede è l'intervallo specificato prima /, che è un sottoinsieme della gamma di volte per il particolare campo. Il primo campo specifica i minuti entro un'ora, quindi */... specifica un intervallo da 0 a 59. Un primo campo di */55 specifica tutti i minuti (compresi nell'intervallo 0-55) che sono multipli di 55 - vale a dire., 0 e 55 minuti dopo ogni ora.

Analogamente, 0-23/2 o */2 nel secondo (in ore) specifica tutte le ore (nell'intervallo 0-23) che sono multipli di 2.

Se viene specificato un intervallo partire eccettuato 0, il numero (per esempio N) dopo che lo / specifica ogni n. minuto/ora/ecc. iniziando dal limite inferiore dell'intervallo. Ad esempio, 3-23/7 nel secondo campo indica ogni settima ora a partire dalle 03:00 (03:00, 10:00, 17:00).

Questo funziona in modo ottimale quando l'intervallo desiderato si divide in modo uniforme nell'unità di tempo immediatamente superiore. Ad esempio, puoi facilmente specificare un evento che si verifichi ogni 1, 2, 3, 4, 5, 6, 10, 12, 15, 20 o 30 minuti o ogni 1, 2, 3, 4, 6 o 12 ore. (Ringrazia i babilonesi per aver scelto unità di tempo con tanti bei divisori.)

Sfortunatamente, cron non ha il concetto di "ogni 55 minuti" entro un intervallo di tempo superiore a un'ora.

Se si desidera eseguire un lavoro ogni 55 minuti (ad esempio, alle 00:00, 00:55, 01:50, 02:45, ecc.), È necessario farlo indirettamente. Un approccio è programmare uno script da eseguire ogni 5 minuti; lo script quindi controlla l'ora corrente e fa il suo lavoro solo una volta ogni 11 volte viene chiamato.

Oppure è possibile utilizzare più righe nel file crontab per eseguire lo stesso lavoro alle 00:00, 00:55, 01:50, ecc. - eccetto che un giorno non è un multiplo di 55 minuti. Se non ti dispiace avere un intervallo più lungo o più breve una volta al giorno, alla settimana o al mese, puoi scrivere un programma per generare un grande crontab con tante voci quante ne hai bisogno, tutte con lo stesso comando in un momento specifico.

+0

Grazie Keith, è più utile del manuale. "Multipli" è il termine giusto? Se si specifica "1-59/55", si finisce con un lavoro che viene eseguito a 1 dopo l'ora ea 56 dopo l'ora. Sarebbe più accurato dire che un passo sarà 1. Esegui sempre per il primo numero di un intervallo 2. Quindi vai avanti per la quantità specificata nell'intervallo ed esegui se il salto successivo è ancora nello stesso intervallo 3. Ripeti 2 fino a quando il salto successivo non è nello stesso intervallo –

+1

Grazie Kieth, prende sempre almeno due programmatori per avvitare una lampadina nel modo giusto :) –

+0

Significa per mesi (che iniziano da 1), che */2 sono mesi dispari o addirittura? E poi c'è una differenza tra */2 e 1-12/2 mesi? –