Παγίδες: κάντε τα σενάρια bash σας πιο ισχυρά

Περιήγηση στο εθνικό δίκτυο συνάντησα ένα ενδιαφέρον άρθρο (το οποίο φέρω εδώ με κείμενο επειδή εξηγείται με επιδεξιότητα) όπου ο συγγραφέας του μας δείχνει πώς να κάνουμε τα σενάρια Bash πιο ανθεκτικά χρησιμοποιώντας Παγίδες.

Κάντε τα σενάρια bash σας πιο ισχυρά με παγίδες

Φανταστείτε ότι έχετε ένα σενάριο bash που εκτελείται καθημερινά κάθε έξι ώρες και ότι κάποια στιγμή καταρρέει ή ότι το ίδιο σενάριο εκτελείται δύο φορές ταυτόχρονα. Αυτές οι δύο καταστάσεις είναι αρκετά άβολα, δεδομένου ότι απαιτούν διόρθωση της ανθρώπινης παρέμβασης ή σε ορισμένες χρονικές στιγμές που δεν μπορούν να αντιμετωπιστούν, αφήνοντας το σύστημα σε ασυνεπή κατάσταση. Η λύση σε αυτό, μεταξύ άλλων, είναι η χρήση παγίδων.

Οι παγίδες είναι ένας απλός και αποτελεσματικός τρόπος για τον έλεγχο της εξόδου των σεναρίων bash. Ας επιστρέψουμε στην ίδια αρχική κατάσταση, εάν το σενάριο σταματήσει χειροκίνητα, για παράδειγμα με το ctrl-c, διακόπτεται η επιστροφή του σήματος εξόδου

INT

και αν τελειώσει με

kill

τότε η έξοδος θα ήταν

TERM.

Μπορείτε να δείτε όλους τους πιθανούς κωδικούς εξόδου

kill -l

Ωστόσο, τα πιο χρησιμοποιημένα είναι ακριβώς

ΕΙΣΟΔΟΣ, ΘΕΣΗ, ΕΞΟΔΟΣ

Εάν το σενάριο αποτελείται, για παράδειγμα, από συγχρονισμό αρχείων με

rsync

το πιο λογικό είναι να βασίζεστε σε ένα αρχείο κλειδώματος που δεν επιτρέπει την εκτέλεση του σεναρίου ταυτόχρονα:

LOCK = "/ var / run / rsync.lock" εάν [! -e $ LOCK]; στη συνέχεια αγγίξτε $ LOCK rsync -avz foo bar rm $ LOCK other echo "rsync is running ήδη" fi

Στα απλά ισπανικά, το παραπάνω σενάριο ελέγχει εάν το αρχείο κλειδώματος υπάρχει και αν δεν υπάρχει, το δημιουργεί και στη συνέχεια εκτελεί την αντίστοιχη εντολή, διαγράφοντας τελικά το αρχείο κλειδώματος. Εάν το αρχείο υπάρχει, το σενάριο απλώς στέλνει ένα μήνυμα στον χρήστη που δείχνει ότι η εντολή εκτελείται ήδη.

Ωστόσο, όταν υπάρχει μια προβληματική κατάσταση, θα μπορούσε να συμβεί ότι το αρχείο κλειδώματος δεν εξαλειφθεί, καταστρέφοντας ανεπιθύμητα αποτελέσματα. Η λύση είναι πολύ απλή:

LOCK = "/ var / run / rsync.lock" εάν [! -e $ LOCK]; στη συνέχεια παγίδα "rm -f $ LOCK; έξοδος" INT TERM EXIT αγγίξτε $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT αλλιώς η ηχώ "rsync τρέχει ήδη" fi

Η ιδιαιτερότητα αυτής της λύσης είναι ότι η εντολή περικλείεται σε παγίδα, έτσι ώστε όταν λαμβάνεται σήμα

ΕΙΣΟΔΟΣ, ΘΕΣΗ, ΕΞΟΔΟΣ

το σενάριο σταματά και διαγράφει το αρχείο κλειδώματος.

Αξίζει να πούμε ότι θα μπορούσε να υπάρξει κατάσταση ανταγωνισμού στο παραπάνω σενάριο μεταξύ του χρόνου επαλήθευσης του αρχείου κλειδώματος και του χρόνου δημιουργίας του. Μια πιθανή λύση θα ήταν να χρησιμοποιήσετε μια λειτουργία ανακατεύθυνσης και boc's noclobber που δεν ανακατευθύνει σε ένα υπάρχον αρχείο:

LOCK = "/ var / run / rsync.lock" if (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; στη συνέχεια παγίδα 'rm -f "$ LOCK"; έξοδος $; " INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT other echo "rsync τρέχει ήδη: $ (cat $ LCK)" fi

Η ιδιαιτερότητα του τελευταίου είναι ότι χρησιμοποιείται όπως είπα ήδη, η λειτουργία noclobber και ότι το αρχείο κλειδώματος περιέχει το PID της διαδικασίας που εκτελείται.

Αξίζει επίσης να σημειωθεί ότι υπάρχουν και άλλες λύσεις όπως

flock

o

solo

Ωστόσο, σε αυτήν την ανάρτηση ήθελα να μοιραστώ τις λύσεις με τους ίδιους πόρους του bash. Μπορείτε να μάθετε περισσότερα σχετικά με τις παγίδες με αυτό εξαιρετικός οδηγός.


5 σχόλια, αφήστε τα δικά σας

Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   Ραφαέλ Κάστρο dijo

    Μεγάλος! Ευχαριστώ που το μοιράστηκες.

  2.   nx dijo

    Ωραίο άρθρο, απλώς αλλάξτε το 'echo "Το rsync εκτελείται ήδη: $ (cat $ LCK)"' σε 'echo "Το rsync εκτελείται ήδη: $ (cat $ LOCK)"'

    αφορά

  3.   δγλάγγος dijo

    Ένα πολύ ενδιαφέρον άρθρο, ναι κύριε! Αυτό το κρατώ.

  4.   Joaquin dijo

    Είναι μια πολύ χρήσιμη εντολή που πρέπει να θυμάστε. Το χρησιμοποίησα σε ένα σενάριο που δημοσίευσα σε μια ανάρτηση, για να διαγράψω ορισμένα αρχεία που το σενάριο δημιούργησε όταν σταμάτησε.

  5.   DaniFP dijo

    Πολύ ενδιαφέρον, ναι κύριε.