Strumenti per sviluppatori · Generatore di Crontab
Giorno del mese vs giorno della settimana in cron: la regola OR che sorprende tutti
· Come funziona
cron calendario pianificazione
Quando entrambi i campi del giorno sono limitati, cron esegue il lavoro se uno dei due corrisponde. Questo post spiega la regola di crontab(5), perché esiste e come ottenere le pianificazioni che impedisce.
Il rapporto è stato pubblicato l'1 e ogni lunedì: l'espressione 0 9 1 * 1 non significa come appare
Un'espressione come `0 9 1 * 1` appare come "09:00 il primo lunedì" se le colonne dei due giorni vengono lette come filtri cumulativi. ToolAcre non lo legge in questo modo. Con il giorno del mese impostato su 1 e il giorno della settimana impostato su Lunedì, il parser avverte che entrambe le condizioni possono corrispondere, quindi la pianificazione include ogni primo e ogni lunedì.
Questa non è una preferenza di formulazione minore. Un report mensile può essere eseguito quattro o cinque volte in più e un'operazione prevista solo il lunedì può essere eseguita anche il primo del mese. Il generatore inserisce un avviso "Vale la pena controllare" accanto alla descrizione in modo che il comportamento espanso sia visibile prima che un'espressione venga copiata in un crontab esterno.
La regola così come è scritta: se sia il giorno del mese che il giorno della settimana sono limitati, il comando viene eseguito quando uno dei due campi corrisponde
La funzione `dayMatches` dell'implementazione gestisce esplicitamente quattro casi. Due caratteri jolly accettano ogni data; un giorno del mese con carattere jolly rinvia al giorno della settimana; un giorno della settimana con carattere jolly rinvia al giorno del mese; e due campi limitati restituiscono l'OR logico delle rispettive corrispondenze. I test coprono una data corrispondente solo al tredicesimo, solo venerdì e nessuna delle due condizioni.
Le descrizioni mantengono la stessa regola. `0 0 13 * 5` viene reso con "il 13 del mese o venerdì", non una congiunzione ambigua. L'analisi, la selezione dell'esecuzione successiva e l'output in inglese utilizzano tutti la stessa interpretazione. Questo comportamento condiviso è una prova più forte di un’etichetta di aiuto isolata perché il disaccordo tra questi percorsi creerebbe immediatamente anteprime fuorvianti.
Il parser implementa OR ed espone la conseguenza; non stabilisce la storia della regola
La struttura della cartella di lavoro offriva una ragione storica per la progettazione della sala operatoria, ma questo archivio dimostra il comportamento piuttosto che la provenienza. I commenti del codice identificano una regola in stile Vixie e i test stabiliscono il risultato modellato da ToolAcre. Non documentano chi ha scelto la norma, quando è stata adottata o perché è stata preferita un’interpretazione permissiva.
Mantenere quel confine è importante nella scrittura tecnica. I lettori devono sapere esattamente come questo strumento espande l'espressione; non hanno bisogno di una narrazione standard inventata per usarlo in modo sicuro. Se una destinazione di distribuzione documenta una semantica di giorni diversi, il suo stesso manuale supera l'anteprima del browser. ToolAcre dichiara il dialetto che calcola invece di affermare che ogni scheduler è d'accordo.
Esempio pratico: enumerazione 0 9 1 * 1 per un mese: i giorni in cui si attiva, rispetto alla pianificazione desiderata dall'autore
Consideriamo un mese il cui primo giorno non sia lunedì. `0 9 1 * 1` produce un'esecuzione alla prima e ulteriori esecuzioni ogni lunedì. Se il primo è lunedì, la data verrà comunque visualizzata una volta perché la ricerca successiva considera un minuto di calendario, non due trigger separati. L'unione cambia nella dimensione con il calendario ma non nella logica.
Puoi ispezionare quell'unione scegliendo un fuso orario e leggendo le prossime cinque esecuzioni. L'anteprima inizia rigorosamente dopo l'istante corrente e ricerca le date del calendario, applicando i campi mese, giorno e ora. Non promette un mese specifico nella prosa dell'articolo perché la lista live dipende da quando e dove il lettore esegue il controllo.
Le soluzioni alternative relative al comando del primo lunedì in stile AND non sono incluse in questo generatore di pianificazione
Il piano suggeriva di incorporare un test della data della shell per ottenere il comportamento AND. ToolAcre non può verificare tale comando: accetta solo i cinque campi di pianificazione e la riga completa copiata contiene un eseguibile segnaposto. La sintassi della shell, l'escape percentuale, la disponibilità dei comandi e il comportamento di uscita appartengono tutti all'ambiente che alla fine esegue il lavoro.
All'interno di questo generatore, la mossa di progettazione sicura consiste nel lasciare il campo di un giorno come `*` a meno che l'unione OR non sia realmente prevista. Per un requisito del primo lunedì, documenta che cron a cinque campi da solo non esprime l'intersezione in questo dialetto. Scegli e testa separatamente una soluzione specifica per l'ambiente invece di presentare uno snippet non eseguito come garantito.
Altri operatori dello scheduler non vengono interpretati da questo parser a cinque campi
Alcune grammatiche di pianificazione espongono operatori come `#`, `L`, `W` o `?`, ma questo parser non ne accetta nessuno. Rifiuta inoltre sei campi e spiega che il suo contratto è una sintassi crontab a cinque campi. Pertanto un'espressione che funziona in un altro prodotto non può essere incollata qui come prova dell'esistenza della stessa regola del calendario.
La traduzione dialettale inizia identificando le grammatiche di origine e di destinazione, non eliminando la punteggiatura finché la convalida non ha esito positivo. ToolAcre può aiutare a costruire i cinque campi, nomi, intervalli, elenchi e passaggi ordinari del target. Non può preservare la semantica portata da un operatore non supportato e gli articoli evitano deliberatamente di descrivere quegli operatori stranieri come se fossero implementati.
L'escape dei comandi non rientra nella grammatica delle sole espressioni
I segni di percentuale e le virgolette dei comandi compaiono dopo la pianificazione e sono all'esterno di `parseCron`. Il parser divide un'espressione esattamente in cinque parti separate da spazi bianchi; non legge mai una pipeline della shell, un comando data o un payload di comandi con escape. Di conseguenza, questo articolo non illustra una soluzione alternativa con il segno di percentuale anche se la cartella di lavoro ne propone una.
Tale omissione è una decisione di correttezza. Uno strumento di pianificazione non dovrebbe implicare che un comando sia sicuro perché i suoi campi temporali sono convalidati. Esamina la sintassi dei comandi nell'implementazione cron e nella shell effettive, con input innocui e output osservabili. Mantieni l'ambito del risultato del generatore in base alla regola del calendario che comprende in modo dimostrabile.
Conclusione: limita il campo a un giorno, non a entrambi, e la spiegazione del generatore rende visibile l'OR prima di salvare la riga
Quando entrambi i campi del giorno sono limitati, leggili come un'unione e pronuncia "o" ad alta voce. Meglio ancora, controlla gli avvisi del generatore e le prossime corse. Se tali date superano il set previsto, restituisci un campo a `*` e risolvi eventuali requisiti più specializzati con un meccanismo documentato dall'ambiente di destinazione.
La lezione principale non è che cron sia misterioso; è che due colonne adiacenti non si combinano come le altre restrizioni. ToolAcre centralizza tale eccezione nella logica di analisi, descrizione e anteprima. Utilizza queste tre visualizzazioni per individuare la mancata corrispondenza prima che un'espressione lasci il browser e diventi una pianificazione operativa.