Εάν έχετε διαχειριστεί ποτέ έναν διακομιστή Linux, έχετε εργαστεί στην ανάπτυξη backend ή έχετε ρυθμίσει αυτοματοποιημένες λειτουργίες cloud, πιθανότατα έχετε συναντήσει μια συμβολοσειρά που μοιάζει με αυτό: 0 2 * * *. Για τους μη μυημένους, μοιάζει με τυπογραφικό λάθος στο πληκτρολόγιο. Για τους διαχειριστές συστήματος, είναι η καρδιά του σύγχρονου αυτοματισμού υποδομής: μια Cron Expression.
Το Cron είναι η αόρατη μηχανή που λειτουργεί στο διαδίκτυο. Διασφαλίζει τη δημιουργία αντιγράφων ασφαλείας της βάσης δεδομένων σας στις 3:00 π.μ., ενεργοποιεί τα μηνύματα ηλεκτρονικού ταχυδρομείου που λαμβάνετε κάθε Δευτέρα το πρωί και διαγράφει τα προσωρινά αρχεία διακομιστή προτού διακοπεί το σύστημα. Όμως, παρά τη δύναμή της, η σύνταξη είναι εμφανώς δύσκολο να αναλυθεί από τους ανθρώπους. Σε αυτή τη βαθιά κατάδυση, θα απομυθοποιήσουμε τους αστερίσκους και θα σας διδάξουμε πώς να διαβάζετε και να γράφετε προγράμματα cron όπως ένας έμπειρος μηχανικός DevOps.
Τι είναι το Cron and the Crontab;
Το Cron είναι ένας προγραμματιστής εργασιών με βάση το χρόνο που βρίσκεται σε λειτουργικά συστήματα υπολογιστών παρόμοια με το Unix. Το όνομα "cron" προέρχεται από την ελληνική λέξη για το χρόνο, chronos. Οι χρήστες που ρυθμίζουν και διατηρούν περιβάλλοντα λογισμικού χρησιμοποιούν το cron για να προγραμματίσουν εργασίες (εντολές ή σενάρια φλοιού) να εκτελούνται περιοδικά σε καθορισμένες ώρες, ημερομηνίες ή διαστήματα.
Το Crontab (Cron Table) είναι το αρχείο διαμόρφωσης όπου αποθηκεύονται αυτά τα χρονοδιαγράμματα. Όταν επεξεργάζεστε το crontab σας μέσω του τερματικού, γράφετε μια λίστα με οδηγίες που ενημερώνουν τον διακομιστή ακριβώς τι πρέπει να εκτελέσει και πότε.
Αποδομώντας τους 5 Αστερίσκους
Μια τυπική έκφραση cron αποτελείται από 5 πεδία που χωρίζονται με λευκό διάστημα. Κάθε πεδίο αντιπροσωπεύει μια συγκεκριμένη μονάδα χρόνου και διαβάζονται πάντα από αριστερά προς τα δεξιά με αυτήν ακριβώς τη σειρά:
* * * * * command_to_execute
- - - - -
| | | | |
| | | | +----- Day of the Week (0 - 6) (Sunday=0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the Month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)
Ένας αστερίσκος (*) σημαίνει "κάθε δυνατή τιμή για αυτό το πεδίο". Έτσι, η έκφραση * * * * * μεταφράζεται κυριολεκτικά σε: "Τρέξε κάθε λεπτό, κάθε ώρας, κάθε μέρας, κάθε μήνα, κάθε ημέρας της εβδομάδας."
Τροποποιητές σύνταξης: Βήματα, εύρη και λίστες
Η δύναμη του cron προέρχεται από τους τροποποιητές του. Δεν περιορίζεστε μόνο σε συγκεκριμένους αριθμούς ή σε «όλα».
1. Ο Step Modifier (/)
Εάν θέλετε ένα σενάριο να εκτελείται κάθε 15 λεπτά, χρησιμοποιείτε ένα βήμα. */15 * * * * σημαίνει "κάθε λεπτό που διαιρείται με το 15". Θα τρέχει στις 0, 15, 30 και 45 μετά την ώρα.
2. Ο Τροποποιητής εύρους (-)
Εάν θέλετε ένα σενάριο να εκτελείται μόνο κατά τις εργάσιμες ώρες, χρησιμοποιείτε ένα εύρος. 0 9-17 * * * σημαίνει "τρέξτε στο λεπτό μηδέν, κάθε ώρα από τις 9 π.μ. έως τις 5 μ.μ.".
3. Ο Τροποποιητής λίστας (,)
Εάν θέλετε κάτι να εκτελείται σε συγκεκριμένες, μη διαδοχικές ημέρες, χρησιμοποιήστε μια λίστα. 0 0 1,15 * * σημαίνει "τρέχει τα μεσάνυχτα της 1ης και της 15ης του μήνα".
Σταματήστε να μαντεύετε τις εκφράσεις Cron
Μην διακινδυνεύετε να εκτελείτε ένα εφεδρικό σενάριο κάθε λεπτό αντί για κάθε μήνα. Ένα μόνο τυπογραφικό λάθος μπορεί να διακόψει τη λειτουργία ενός διακομιστή παραγωγής. Χρησιμοποιήστε τη διαδραστική οπτική μας γεννήτρια για να δημιουργήσετε και να επικυρώσετε τις συμβολοσειρές cron με ασφάλεια.
Ανοίξτε το Cron Job GeneratorΤο πιο επικίνδυνο λάθος του Cron
Το πιο συνηθισμένο και καταστροφικό λάθος που κάνουν οι προγραμματιστές είναι να μπερδεύουν το πεδίο "Minute". Ας δούμε ένα σενάριο όπου θέλετε να εκτελείτε ένα σενάριο εκκαθάρισης βάσης δεδομένων μία φορά την ώρα στις 2:00 π.μ.
Το λάθος: * 2 * * *
Εάν γράψετε τα παραπάνω, λέτε στον διακομιστή να τρέξει το σενάριο "Κάθε λεπτό, κατά τη 2η ώρα της ημέρας". Το σενάριο εκκαθάρισης της βαριάς βάσης δεδομένων σας θα ενεργοποιηθεί 60 συνεχόμενες φορές, πιθανότατα υπερφορτώνοντας την CPU σας, κλειδώνοντας πίνακες βάσης δεδομένων και προκαλώντας τεράστια διακοπή λειτουργίας.
Ο σωστός τρόπος: 0 2 * * *
Αυτό λέει ρητά στον διακομιστή να τρέχει μόνο στο "Λεπτό μηδέν, της 2ης ώρας". Θα εκτελεστεί ακριβώς μία φορά στις 2:00 π.μ.
Συχνές Ερωτήσεις (FAQ)
Το cron λαμβάνει υπόψη τις Ζώνες ώρας;
Από προεπιλογή, το cron αξιολογεί εκφράσεις με βάση την τοπική ώρα συστήματος του διακομιστή στον οποίο εκτελείται. Εάν ο διακομιστής σας φιλοξενείται σε μια περιοχή AWS στο Λονδίνο, εκτελείται σε UTC/GMT. Πρέπει να λάβετε υπόψη τις διαφορές ζώνης ώρας εάν οι χρήστες σας βρίσκονται στη Νέα Υόρκη ή στο Τόκιο.
Μπορώ να προγραμματίσω μια εργασία cron να εκτελείται κάθε δευτερόλεπτο;
Όχι. Το Standard Unix cron περιορίζεται σε ανάλυση ενός λεπτού. Εάν χρειάζεστε προγραμματισμό δευτερευόντων λεπτών (π.χ. κάθε 10 δευτερόλεπτα), πρέπει να χρησιμοποιήσετε ένα ξεχωριστό εργαλείο δαίμονα ή να γράψετε ένα σενάριο που να εκτελείται κάθε λεπτό αλλά να επαναλαμβάνεται εσωτερικά με εντολές ύπνου.
Τι σημαίνουν συμβολοσειρές όπως @daily ή @hourly;
Πολλές σύγχρονες υλοποιήσεις του cron υποστηρίζουν μη τυπικές προκαθορισμένες μακροεντολές για να διευκολύνουν τον προγραμματισμό. Το @daily είναι ακριβώς το ίδιο με το 0 0 * * * (μεσάνυχτα κάθε μέρα). Το @hourly είναι το ίδιο με το 0 * * * *. Αν και είναι χρήσιμα, δεν υποστηρίζονται καθολικά σε όλα τα παλαιού τύπου συστήματα.