Τι είναι μια έκφραση cron;
Μια έκφραση cron είναι μια συμπαγής συμβολοσειρά χρονοπρογραμματισμού που λέει σε έναν προγραμματιστή εργασιών ακριβώς πότε να εκτελέσει μια εργασία. Η μορφή γεννήθηκε το 1975 μέσα στον δαίμονα Unix V7 cron και ελάχιστα έχει αλλάξει από τότε — η ίδια γραμματική πέντε πεδίων εμφανίζεται σήμερα σε Kubernetes CronJobs, AWS EventBridge, GitHub Actions workflows, Google Cloud Scheduler, GitLab CI, Jenkins pipelines και το δυαδικό crontab που εξακολουθεί να αποστέλλεται με κάθε διανομή Linux. Η γραμματική συσκευάζει πολλή σημασία σε περίπου δεκατρείς χαρακτήρες, γι' αυτό ένας αναλυτής που τη μετατρέπει σε απλά Αγγλικά είναι η διαφορά ανάμεσα σε μια σίγουρη ανάπτυξη και μια επαναφορά στις 3 π.μ.
Πώς λειτουργεί μια έκφραση cron;
Μια τυπική έκφραση cron έχει πέντε πεδία διαχωρισμένα με κενά που μαζί ορίζουν ένα επαναλαμβανόμενο χρονοδιάγραμμα. Η μηχανή ελέγχει το τρέχον ρολόι τοίχου έναντι της έκφρασης κάθε λεπτό και ενεργοποιεί την εργασία όταν και τα πέντε πεδία ταιριάζουν. Τα πεδία, από αριστερά προς τα δεξιά:
- Λεπτό (0–59). Ποιο λεπτό μέσα στην ώρα τρέχει η εργασία.
0σημαίνει στην ακρίβεια της ώρας,30σημαίνει στις μισή,*/5σημαίνει κάθε πέντε λεπτά (00, 05, 10, ...) και15,45σημαίνει στο τέταρτο και στο τρία τέταρτα. - Ώρα (0–23). Ποια ώρα της ημέρας στο 24ωρο ρολόι.
0είναι μεσάνυχτα,9είναι 9 π.μ.,17είναι 5 μ.μ. Εύρη (9-17για εργάσιμες ώρες) και τιμές βήματος (*/2για κάθε δεύτερη ώρα) λειτουργούν όπως και για τα λεπτά. - Ημέρα μήνα (1–31). Ποια ημερολογιακή ημέρα να τρέξει.
1σημαίνει την 1η του μήνα,*σημαίνει κάθε μέρα,1,15σημαίνει την 1η και τη 15η. Προσέξτε με το31— παρακάμπτει σιωπηλά μήνες που δεν έχουν 31η ημέρα. - Μήνας (1–12 ή ΙΑΝ–ΔΕΚ). Ποιοι μήνες να τρέξει.
*σημαίνει κάθε μήνα,1,7σημαίνει Ιανουάριο και Ιούλιο,1-3σημαίνει μόνο Q1. Τα τρίγραμμα ονόματα μηνών είναι case-insensitive στις περισσότερες υλοποιήσεις. - Ημέρα εβδομάδας (0–7, όπου και το 0 και το 7 σημαίνουν Κυριακή). Περιορίζει την ενεργοποίηση σε συγκεκριμένες καθημερινές.
1-5είναι Δευτέρα έως Παρασκευή,0,6είναι το σαββατοκύριακο,MON-FRIλειτουργεί στους περισσότερους αναλυτές. Όταν και η ημέρα-μήνα και η ημέρα-εβδομάδας είναι ορισμένες σε συγκεκριμένες τιμές, το κλασικό cron ενεργοποιείται σε οποιαδήποτε αντιστοιχία (λογικό OR), κάτι που εκπλήσσει τους ανθρώπους κάθε φορά.
Γιατί να χρησιμοποιήσετε έναν αναλυτή εκφράσεων cron;
- Πιάστε τη σιωπηλή παρανάγνωση πριν από την ανάπτυξη. Η έκφραση `0 2 */3 * *` ενεργοποιείται στις 2 π.μ. κάθε τρίτη μέρα, όχι κάθε τρία λεπτά — επικολλήστε την εδώ και θα το δείτε σε απλά Αγγλικά πριν σταλεί στην παραγωγή.
- Οι περισσότεροι cloud προγραμματιστές τρέχουν σε UTC από προεπιλογή. Η προεπισκόπηση των επόμενων δέκα ωρών εκτέλεσης στην τοπική ζώνη σας φέρνει στην επιφάνεια την απόκλιση DST της μίας ώρας πριν ειδοποιήσει κάποιον στις 3 π.μ.
- Συντομεύσεις όπως `@daily`, `@weekly` και `@monthly` είναι βολικές αλλά διφορούμενες. Ο αναλυτής σας δείχνει την υποκείμενη μορφή πέντε πεδίων ώστε να γνωρίζετε ακριβώς τι προγραμματίστηκε.
- Ο δημιουργός πεδίο-προς-πεδίο σας επιτρέπει να συνθέσετε ένα χρονοδιάγραμμα μία στήλη τη φορά και να βλέπετε την ανθρώπινη περιγραφή να ενημερώνεται ζωντανά, που είναι πολύ πιο γρήγορο από το να ξαναδιαβάζετε τη σελίδα man του cron για δέκατη φορά.
Πού χρησιμοποιούνται οι εκφράσεις cron;
Η σύνταξη cron εμφανίζεται όπου μια εργασία χρειάζεται να επαναλαμβάνεται σε ένα ρολόι. Τρεις από τις πιο συνηθισμένες επιφάνειες, με την ακριβή παγίδα για την οποία είναι γνωστή η καθεμία:
- Χρονοδιαγράμματα αντιγράφων ασφαλείας. Η κλασική καταχώρηση `crontab -e` που κάνει dump μιας βάσης δεδομένων στο S3 στις 2 π.μ. καθημερινά ή περιστρέφει ένα αρχείο `pg_dump` την 1η κάθε μήνα. Μια γραμμή όπως `0 2 * * * /usr/local/bin/backup.sh` έχει σταλεί σε περισσότερους διακομιστές Linux από οποιαδήποτε άλλη γραμμή cron στην ιστορία. Βάλτε σωστά το λεπτό και την ώρα, ανακατευθύνετε το stderr κάπου ανθεκτικό και έχετε αντικαταστήσει μια χειροκίνητη λίστα ελέγχου με ένα σενάριο fire-and-forget.
- Ενεργοποιήσεις `schedule` GitHub Actions. Το κλειδί `on.schedule.cron` στα `.github/workflows/*.yml` δέχεται τυπικό cron πέντε πεδίων, αλλά η εργασία τρέχει πάντα σε UTC και το GitHub θα παρακάμψει σιωπηλά μια ώρα εκτέλεσης αν η ουρά runner είναι απασχολημένη. Συνήθης μορφή: `cron: '0 9 * * 1-5'` για αποστολή μιας περίληψης Δευτέρα-Παρασκευή στις 9 π.μ. UTC. Κάντε προεπισκόπηση εδώ στην τοπική σας ζώνη πρώτα, ώστε να μην υποσχεθείτε μια περίληψη 9 π.μ. Λονδίνου που τελικά φτάνει στις 10 π.μ. BST.
- AWS EventBridge Scheduler. Οι εκφράσεις cron EventBridge παίρνουν ένα έκτο πεδίο για το έτος και απαιτούν `?` αντί για `*` είτε στο πεδίο ημέρα-μήνα είτε ημέρα-εβδομάδας — το `cron(0 9 ? * MON-FRI *)` είναι η μετάφραση EventBridge του κλασικού cron εργάσιμων ημερών 9 π.μ. Χρησιμοποιείται για προγραμματισμένες κλήσεις Lambda, εκτελέσεις εργασιών ECS και εκκινήσεις μηχανών κατάστασης Step Function· η αναντιστοιχία με την κλασική σύνταξη cron είναι η νούμερο ένα πηγή σφαλμάτων `ValidationException` σε αναπτύξεις CloudFormation.
Πώς μοιάζει μια πραγματική έκφραση cron;
Πάρτε 0 9 * * 1-5 — ενεργοποιείται στις 9:00 π.μ., κάθε εργάσιμη. Διαβάζοντας τα πεδία από αριστερά προς τα δεξιά: 0 είναι το μηδενικό λεπτό της ώρας, 9 είναι 9 π.μ. στο 24ωρο ρολόι, * στην ημέρα-μήνα σημαίνει κάθε ημερολογιακή ημέρα, * στον μήνα σημαίνει κάθε μήνα και 1-5 στην ημέρα-εβδομάδας περιορίζει την ενεργοποίηση από Δευτέρα έως Παρασκευή (όπου 1 = Δευτέρα στην τυπική αρίθμηση cron). Επικολλήστε το στην είσοδο παραπάνω και ο αναλυτής επιβεβαιώνει Στις 09:00 π.μ., Δευτέρα έως Παρασκευή με τις επόμενες δέκα ημερομηνίες ενεργοποίησης που εμφανίζονται σε όποια ζώνη IANA επιλέξετε. Η ίδια πρόθεση σε σύνταξη AWS EventBridge είναι cron(0 9 ? * MON-FRI *) — σημειώστε το πεδίο έτους στο τέλος και το ? όπου το τυπικό cron θα χρησιμοποιούσε *. Η ίδια πρόθεση ως έκφραση Quartz (έξι πεδίων με κύρια δευτερόλεπτα) είναι 0 0 9 ? * MON-FRI. Τρεις διαφορετικές πλατφόρμες, τρεις διαφορετικές μορφές επιφάνειας, ένα υποκείμενο χρονοδιάγραμμα.
Οι εκφράσεις cron είναι αμείλικτες με ακριβώς έναν τρόπο: ένα τυπογραφικό λάθος σας δίνει ένα συντακτικά έγκυρο χρονοδιάγραμμα που ενεργοποιείται σε λάθος χρόνο, χωρίς σφάλμα για να το πιάσετε στην αναθεώρηση κώδικα. Το να διαβάζετε `0 0 1 * *` και να γνωρίζετε ότι τρέχει τα μεσάνυχτα την 1η κάθε μήνα, όχι την 1η Ιανουαρίου, απαιτεί εξάσκηση. Ο αναλυτής παραπάνω μετατρέπει αυτή την εξάσκηση σε έναν έλεγχο δέκα δευτερολέπτων — επικολλήστε την έκφραση, διαβάστε τα Αγγλικά, σαρώστε τις επόμενες δέκα ώρες εκτέλεσης στην τοπική σας ζώνη και στείλτε το YAML γνωρίζοντας ότι η γραμμή cron κάνει πραγματικά ό,τι λέει το μήνυμα commit.
Ποια είναι η διαφορά μεταξύ cron 5 πεδίων και 6 πεδίων;
Το cron πέντε πεδίων είναι η κλασική γραμματική Unix με ανάλυση ενός λεπτού. Το cron έξι πεδίων προσθέτει μια κύρια στήλη δευτερολέπτων για προγραμματισμό υπο-λεπτού — χρησιμοποιείται από το Quartz και το @Scheduled του Spring. Το AWS EventBridge χρησιμοποιεί επίσης έξι πεδία, αλλά η επιπλέον στήλη του είναι ένα τελικό έτος, όχι δευτερόλεπτα.
Τι σημαίνουν τα @hourly, @daily και @weekly;
Ψευδώνυμα Vixie-cron που εισήχθησαν το 1987. @hourly = 0 * * * *, @daily = 0 0 * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * *, @yearly = 0 0 1 1 *. @reboot ενεργοποιείται μία φορά κατά την εκκίνηση. Τα GitHub Actions και EventBridge απορρίπτουν αυτά τα ψευδώνυμα.
Είναι η Κυριακή ημέρα 0 ή ημέρα 7 στο cron;
Και τα δύο, στο κλασικό Vixie cron — τα 0 και 7 γίνονται αποδεκτά ώστε εύρη όπως 5-7 να διαβάζονται φυσικά ως Παρασκευή-έως-Κυριακή. Η Δευτέρα είναι πάντα 1, το Σάββατο είναι πάντα 6. Το Quartz και το AWS EventBridge χρησιμοποιούν διαφορετική σύμβαση: 1-7 με Κυριακή ως 1. Ελέγξτε τα έγγραφα της πλατφόρμας πριν υποθέσετε.
Πώς χειρίζεται το cron τη θερινή ώρα;
Εξαρτάται από τη ζώνη ώρας της μηχανής. Σε UTC (η προεπιλογή σε EventBridge, Kubernetes και GitHub Actions) η DST δεν υπάρχει. Σε μια τοπική ζώνη DST, το κλασικό Vixie cron παρακάμπτει εργασίες κατά το χάσμα της εαρινής ώρας και τις τρέχει δύο φορές κατά τη φθινοπωρινή επαναφορά· οι χρονοδιακόπτες systemd ενεργοποιούνται ακριβώς μία φορά.