Πώς να εκτελέσετε μια εργασία όταν ένα νέο αρχείο προστίθεται σε έναν κατάλογο στο Linux

Αυτό το σεμινάριο θα σας δείξει πώς να χρησιμοποιείτε συμβάντα συστήματος αρχείων Linux (ειδοποίηση) για να λαμβάνετε ειδοποίηση κάθε φορά που ένα αρχείο εμφανίζεται σε έναν κατάλογο. Θα μπορούσατε να τα χρησιμοποιήσετε ως ενεργοποιητές για να αυτοματοποιήσετε κοινές εργασίες στο σύστημά σας.

Θα γράψουμε ένα σενάριο που παρακολουθεί έναν κατάλογο και ενεργεί σε νέα αρχεία που προστίθενται. Κάθε αρχείο γίνεται με gzip και μετακινείται σε άλλο κατάλογο, μόλις εντοπιστεί. Το σενάριο χρησιμοποιεί το υποσύστημα inotify, μέσω ενός βοηθητικού προγράμματος που ονομάζεται inotify-tools. Αλλά πρώτα, ας εγκαταστήσουμε το εργαλείο και ας πειραματιστούμε.

Εγκατάσταση inotify-tools και gzip

Χρησιμοποιήστε το apt-get για να εγκαταστήσετε αυτό το πακέτο στο σύστημά σας εάν χρησιμοποιείτε Ubuntu ή άλλη διανομή που βασίζεται στο Debian. Σε άλλες διανομές Linux, χρησιμοποιήστε αντί αυτού το εργαλείο διαχείρισης πακέτων της διανομής σας Linux.

sudo apt-get install inotify-tools gzip

Πειραματισμός με τα εργαλεία inotify

Ας ξεκινήσουμε παρακολουθώντας έναν κατάλογο και βλέποντας ποια συμβάντα ξεκινούν όταν φτάνουν νέα αρχεία. Θα χρησιμοποιήσουμε ένα εργαλείο που ονομάζεται inotifywatch , το οποίο αποτελεί μέρος του inotify-tools. Δημιουργήστε έναν νέο κατάλογο που ονομάζεται “incoming”:

mkdir incoming

Ξεκινήστε να παρακολουθείτε αυτόν τον κατάλογο εκτελώντας την ακόλουθη εντολή:

inotifywatch -v incoming

Αυτό θα δώσει εντολή στο inotify να παρακολουθεί όλα τα συμβάντα του συστήματος αρχείων στον κατάλογο “εισερχόμενα”. Η επιλογή -v κάνει το εργαλείο να εκτυπώνει επιπλέον πληροφορίες σχετικά με το τι κάνει. Δεν έχουμε ορίσει επιλογή χρονικού ορίου (-t ) και η εντολή θα συνεχίσει να συγκεντρώνει συμβάντα μέχρι να βγούμε με CTRL+C. Σε αυτό το σημείο, το τερματικό μας θα πρέπει να μοιάζει κάπως έτσι:

  Πώς να εγκαταστήσετε το Sigil eBook Editor σε Linux

Ανοίξτε ένα νέο παράθυρο τερματικού (ή καρτέλα) και μεταβείτε στον κατάλογο εισερχόμενων. Χρησιμοποιήστε την εντολή αφής για να δημιουργήσετε ένα νέο αρχείο με το όνομα “newfile”.

cd incoming/
touch newfile

Τώρα επιστρέψτε στο πρώτο παράθυρο τερματικού και σταματήστε το inotifywatch πατώντας CTRL+C.

Ένας πίνακας συμβάντων θα προβληθεί στην κονσόλα, υποδεικνύοντας μια παρουσία των “create”, “open”, “attrib” και “close_write”. Αυτά τα τέσσερα συμβάντα συνέβησαν όταν χρησιμοποιήσαμε το άγγιγμα για να δημιουργήσουμε ένα νέο αρχείο, ορίσαμε τα χαρακτηριστικά πρόσβασης στο αρχείο, το ανοίξαμε για να γράψουμε έναν μηδενικό τερματικό χαρακτήρα και μετά το κλείσαμε. Αυτά είναι μόνο μερικά από τα πολλά συμβάντα που μπορούν να παρακολουθηθούν σε ένα σύστημα αρχείων με τα εργαλεία inotify. Μπορείτε να δείτε την πλήρη λίστα στην κεντρική σελίδα για το inotifywatch.

Για τους σκοπούς μας, μας ενδιαφέρουν μόνο δύο εκδηλώσεις:

“create” – όταν δημιουργείται ένα αρχείο στον κατάλογο προορισμού.
“moved_to” – όταν ένα αρχείο μετακινείται από άλλη θέση στον κατάλογο προορισμού.

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

inotifywatch -v -e create -e moved_to incoming

Στο δεύτερο παράθυρο τερματικού ή καρτέλα, ας προσπαθήσουμε να δημιουργήσουμε ένα νέο αρχείο, να αλλάξουμε τα περιεχόμενά του και, στη συνέχεια, να μετακινήσουμε το αρχείο από άλλη θέση στον κατάλογο προορισμού. Όλες αυτές οι εντολές εκτελούνται από τον αρχικό κατάλογο.

touch incoming/created
echo Testing123 >> incoming/created
touch /tmp/created2
mv /tmp/created2 incoming/

Επιστρέψτε στο πρώτο παράθυρο τερματικού και σταματήστε το inotifywatch πατώντας CTRL+C. Θα δούμε την ακόλουθη έξοδο:

  Πώς να εγκαταστήσετε το πρόγραμμα οδήγησης Nvidia Beta σε Linux

Καταμετρήθηκαν μόνο δύο συμβάντα: η δημιουργία ενός αρχείου που ονομάζεται “created.txt” και η μετακίνηση ενός υπάρχοντος αρχείου που ονομάζεται “created2.txt”. Όλα τα άλλα, όπως η τροποποίηση του “created.txt”, αγνοήθηκαν.

Παρακολούθηση καταλόγου και εκτέλεση εργασίας

Τώρα που ξέρουμε ποια συμβάντα πρέπει να ακολουθήσουμε, μπορούμε να χρησιμοποιήσουμε ένα άλλο εργαλείο που ονομάζεται inotifywait για να αποκλείσουμε την εκτέλεση μέχρι να δημιουργηθεί ένα αρχείο ή να μετακινηθεί στον κατάλογο προορισμού μας. Θα χρησιμοποιήσουμε τα ίδια ορίσματα όπως κάναμε με το inotifywatch και θα καθορίσουμε επίσης πώς θέλουμε να μορφοποιηθεί το όνομα αρχείου για χρήση στην εργασία μας.

Πριν ξεκινήσουμε, χρειαζόμαστε έναν κατάλογο για να αποθηκεύουμε αρχεία που έχουν ήδη υποβληθεί σε επεξεργασία. Δημιουργήστε έναν κατάλογο που ονομάζεται “επεξεργασμένο”:

mkdir processed

Στη συνέχεια, δημιουργήστε ένα νέο σενάριο που ονομάζεται “watch-incoming.sh” και προσθέστε τα περιεχόμενα που αναφέρονται παρακάτω:

#!/bin/bash

TARGET=~/incoming/
PROCESSED=~/processed/

inotifywait -m -e create -e moved_to --format "%f" $TARGET 
        | while read FILENAME
                do
                        echo Detected $FILENAME, moving and zipping
                        mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
                        gzip "$PROCESSED/$FILENAME"
                done

Το σενάριο εκτελεί την εντολή inotifywait με την επιλογή -m. Αυτό κάνει την οθόνη εντολών να αλλάζει επ’ αόριστον. Κάθε φορά που εντοπίζεται ένα νέο συμβάν, το όνομα αρχείου μεταβιβάζεται στην εντολή ανάγνωσης και εισάγεται στη μεταβλητή “FILENAME”. Εκτελείται το μπλοκ κάτω από τον βρόχο while, στο οποίο το αρχείο μετακινείται πρώτα στον κατάλογο “επεξεργασμένο” και στη συνέχεια γίνεται gzip. Το αρχικό αρχείο αντικαθίσταται από το συμπιεσμένο αρχείο και το όνομα αρχείου θα τελειώνει σε “.gz”.

  Πώς να χρησιμοποιήσετε το Dashlane Password Manager στο Linux με το Google Chrome

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

chmod u+x watch-incoming.sh
./watch-incoming.sh

Ανοίξτε το δεύτερο παράθυρο τερματικού και δημιουργήστε ένα νέο αρχείο στον κατάλογο “εισερχόμενα”. Καταχωρίστε τα περιεχόμενα τόσο του καταλόγου “εισερχόμενο” και “επεξεργασμένο” για να δείτε τα αποτελέσματα του συμβάντος που ανιχνεύεται:

Το ακατέργαστο αρχείο κειμένου που αντιγράψαμε στον κατάλογο “εισερχόμενο” εντοπίστηκε από το σενάριο, αντιγράφηκε στο “επεξεργασμένο” και στη συνέχεια συμπιέστηκε χρησιμοποιώντας gzip.

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