Πώς να χρησιμοποιήσετε την εντολή χρονικού ορίου στο Linux

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

Τι κάνει για εσάς το timeout;

Η εντολή timeout σας επιτρέπει να ορίστε ένα όριο στη διάρκεια του χρόνου θα τρέξει ένα πρόγραμμα για. Αλλά γιατί θα θέλατε να το κάνετε αυτό;

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

Μια άλλη περίπτωση είναι όταν δεν ξέρετε πόσο καιρό θέλετε να εκτελεστεί μια διαδικασία, αλλά ξέρετε ότι δεν θέλετε να εκτελείται επ ‘αόριστον. Μπορεί να έχετε τη συνήθεια να ρυθμίζετε τις διαδικασίες που εκτελούνται, να ελαχιστοποιείτε το παράθυρο του τερματικού και να τις ξεχνάτε.

Ορισμένα προγράμματα—ακόμα και απλά βοηθητικά προγράμματα—μπορούν να δημιουργήσουν κίνηση δικτύου σε επίπεδα που μπορεί να εμποδίσουν την απόδοση του δικτύου σας. Ή μπορούν να συνδέσουν τους πόρους σε μια συσκευή-στόχο, επιβραδύνοντας την απόδοσή της. (ping, σε κοιτάζω.) Το να αφήνεις τέτοιου είδους προγράμματα να εκτελούνται για παρατεταμένες περιόδους ενώ λείπεις από τον υπολογιστή σου είναι κακή πρακτική.

τάιμ άουτ είναι μέρος του GNU Core Utils Έτσι, λειτουργικά συστήματα Linux και Unix όπως το macOS έχουν όλα ενσωματωμένο χρονικό όριο. Δεν υπάρχει τίποτα για εγκατάσταση. μπορείτε να το χρησιμοποιήσετε απευθείας από το κουτί.

Ξεκινώντας με το timeout

Εδώ είναι ένα απλό παράδειγμα. Για παράδειγμα, με τις προεπιλεγμένες επιλογές της γραμμής εντολών, η εντολή ping θα εκτελεστεί μέχρι να τη σταματήσετε πατώντας Ctrl+C. Αν δεν το διακόψετε, απλά θα συνεχίσει.

ping 192.168.4.28

Χρησιμοποιώντας το χρονικό όριο, μπορούμε να βεβαιωθούμε ότι το ping δεν εκτελείται συνεχώς, μασώντας το εύρος ζώνης του δικτύου και ενοχλώντας οποιαδήποτε συσκευή γίνεται ping.

Αυτή η επόμενη εντολή χρησιμοποιεί το timeout για το ping χρονικού ορίου. Επιτρέπουμε 15 δευτερόλεπτα χρόνου εκτέλεσης για ping.

timeout 15 ping 192.168.4.28

Μετά από 15 δευτερόλεπτα το χρονικό όριο λήξης τερματίζει τη συνεδρία ping και επιστρέφουμε στη γραμμή εντολών.

  Πώς να βελτιστοποιήσετε ένα SSD σε Linux

Χρήση χρονικού ορίου με άλλες μονάδες χρόνου

Σημειώστε ότι δεν χρειάστηκε να προσθέσουμε ένα «s» πίσω από το 15. Το χρονικό όριο προϋποθέτει ότι η τιμή είναι σε δευτερόλεπτα. Θα μπορούσατε να προσθέσετε ένα “s”, αλλά πραγματικά δεν έχει καμία διαφορά.

Για να χρησιμοποιήσετε μια τιμή χρόνου που μετράται σε λεπτά, ώρες ή ημέρες, προσθέστε ένα “m”, ένα “h” ή ένα “d”.

Για να εκτελέσετε το ping για τρία λεπτά, χρησιμοποιήστε την ακόλουθη εντολή:

timeout 3m ping 192.168.4.28

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

Περιορισμός λήψης δεδομένων με χρονικό όριο

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

Σε αυτό το παράδειγμα, χρησιμοποιούμε το tcpdump, a σύλληψη κίνησης δικτύου εργαλείο. Στις δοκιμαστικές μηχανές στις οποίες έγινε έρευνα αυτού του άρθρου, το tcpdump ήταν ήδη εγκατεστημένο στο Ubuntu Linux και στο Fedora Linux. Έπρεπε να εγκατασταθεί σε Manjaro Linux και Arch Linux, με την ακόλουθη εντολή:

sudo pacman -Syu tcpdump

Μπορούμε να εκτελέσουμε το tcpdump για 10 δευτερόλεπτα με τις προεπιλεγμένες επιλογές του και να ανακατευθύνουμε την έξοδο του σε ένα αρχείο που ονομάζεται capture.txt με την ακόλουθη εντολή:

timeout 10 sudo tcpdump > capture.txt

timeout 10 sudo tcpdump > capture.txt σε παράθυρο τερματικού” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>(το tcpdump έχει τις δικές του επιλογές για την αποθήκευση της συλλεγμένης κίνησης δικτύου σε ένα αρχείο. Πρόκειται για μια γρήγορη εισβολή επειδή συζητάμε για το χρονικό όριο, όχι για το tcpdump.)</p>
<p>Το tcpdump ξεκινά να καταγράφει την κυκλοφορία του δικτύου και περιμένουμε 10 δευτερόλεπτα.  Και 10 δευτερόλεπτα έρχονται και παρέρχονται και το tcpdump εξακολουθεί να εκτελείται και το capture.txt εξακολουθεί να μεγαλώνει σε μέγεθος.  Θα χρειαστεί ένα βιαστικό Ctrl+C για να σταματήσει το tcpdump.</p>
<p>Ο έλεγχος του μεγέθους του capture.txt με το ls δείχνει ότι αυξήθηκε στα 209K μέσα σε λίγα δευτερόλεπτα.  Αυτό το αρχείο μεγάλωνε γρήγορα!</p>
<pre>ls -lh capture.txt</pre>
<p><img decoding=

Τι συνέβη? Γιατί το χρονικό όριο δεν σταμάτησε το tcpdump;

Όλα έχουν να κάνουν με σήματα.

Αποστολή του σωστού σήματος

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

  Πώς να χρησιμοποιήσετε το πρόγραμμα περιήγησης Pale Moon στο Linux

Μπορούμε να το κάνουμε αυτό ζητώντας το timeout για να στείλει το σήμα SIGKILL.

Το σήμα SIGKILL δεν μπορεί να “πιαστεί, να αποκλειστεί ή να αγνοηθεί” – περνάει πάντα. Ο SIGKILL δεν ζητά ευγενικά το πρόγραμμα να σταματήσει. Το SIGKILL κρύβεται στη γωνία με ένα χρονόμετρο και ένα cosh.

Μπορούμε να χρησιμοποιήσουμε την επιλογή -s (σήμα) για να πούμε το χρονικό όριο για την αποστολή του σήματος SIGKILL.

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

timeout -s SIGKILL 10 sudo tcpdump > capture.txt σε παράθυρο τερματικού” width=”646″ ύψος=”167″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Αυτή τη φορά, μόλις περάσουν 10 δευτερόλεπτα, το tcpdump διακόπτεται.</p>
</p>
<p> img src=” http:=”” width=”646″ height=”197″/></p>
<h2 role=Ρωτώντας Ευγενικά Πρώτα

Μπορούμε να ζητήσουμε το χρονικό όριο για να προσπαθήσουμε να σταματήσουμε το πρόγραμμα χρησιμοποιώντας το SIGTERM και να στείλουμε το SIGKILL μόνο εάν το SIGTERM δεν λειτούργησε.

Για να το κάνουμε αυτό, χρησιμοποιούμε την επιλογή -k (kill after). Η επιλογή -k απαιτεί μια τιμή χρόνου ως παράμετρο.

Σε αυτήν την εντολή, ζητάμε το χρονικό όριο για να αφήσουμε το dmesg να εκτελεστεί για 30 δευτερόλεπτα και στη συνέχεια να το τερματίσουμε με το σήμα SIGTERM. Εάν το dmesg εξακολουθεί να εκτελείται μετά από 40 δευτερόλεπτα, σημαίνει ότι το διπλωματικό SIGTERM αγνοήθηκε και το χρονικό όριο θα πρέπει να σταλεί στο SIGKILL για να ολοκληρωθεί η εργασία.

Το dmesg είναι ένα βοηθητικό πρόγραμμα που μπορεί παρακολουθήστε τα μηνύματα buffer του δακτυλίου του πυρήνα και εμφανίστε τα σε ένα παράθυρο τερματικού.

timeout -k 40 30 dmseg -w

Το dmesg εκτελείται για 30 δευτερόλεπτα και σταματά όταν λάβει το σήμα SIGTERM.

Γνωρίζουμε ότι δεν ήταν το SIGKILL που σταμάτησε το dmesg επειδή το SIGKILL πάντα αφήνει μια μονολεκτική νεκρολογία στο παράθυρο του τερματικού: “Killed”. Αυτό δεν συνέβη σε αυτή την περίπτωση.

Ανάκτηση του Κωδικού Εξόδου του Προγράμματος

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

Το timeout παρέχει τον δικό του κωδικό εξόδου, αλλά μπορεί να μην μας ενδιαφέρει αυτό. Πιθανότατα μας ενδιαφέρει περισσότερο ο κωδικός εξόδου από τη διαδικασία που ελέγχει το timeout.

  Πώς να κάνετε το Linux να μοιάζει με τα Windows 10

Αυτή η εντολή επιτρέπει την εκτέλεση του ping για πέντε δευτερόλεπτα. Πραγματοποιεί ping σε έναν υπολογιστή που ονομάζεται Nostromo, ο οποίος βρίσκεται στο δοκιμαστικό δίκτυο που χρησιμοποιήθηκε για την έρευνα αυτού του άρθρου.

timeout 5 ping Nostromo.local

Η εντολή εκτελείται για πέντε δευτερόλεπτα και το χρονικό όριο τερματίζει. Στη συνέχεια, μπορούμε να ελέγξουμε τον κωδικό εξόδου χρησιμοποιώντας αυτήν την εντολή:

echo $?

Ο κωδικός εξόδου είναι 124. Αυτή είναι η τιμή που χρησιμοποιεί το χρονικό όριο για να υποδείξει ότι το πρόγραμμα τερματίστηκε χρησιμοποιώντας το SIGTERM. Εάν το SIGKILL τερματίσει το πρόγραμμα, ο κωδικός εξόδου είναι 137.

Αν διακόψουμε το πρόγραμμα με Ctrl+C ο κωδικός εξόδου από το timeout είναι μηδέν.

timeout 5 ping Nostromo.local
echo $?

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

Για να συμβεί αυτό, το πρόγραμμα πρέπει να σταματήσει από μόνο του (με άλλα λόγια, δεν τερματίζεται με timeout) και πρέπει να χρησιμοποιήσουμε την επιλογή –διατήρηση-κατάσταση.

Εάν χρησιμοποιήσουμε την επιλογή -c (count) με τιμή πέντε ping, θα ενεργοποιηθούν μόνο πέντε αιτήματα. Αν δώσουμε timeout διάρκειας ενός λεπτού, το ping θα έχει σίγουρα τερματιστεί από μόνο του. Στη συνέχεια, μπορούμε να ελέγξουμε την τιμή εξόδου χρησιμοποιώντας ηχώ.

timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?

Το ping ολοκληρώνει τα πέντε αιτήματα ping και τερματίζει. Ο κωδικός εξόδου είναι μηδέν.

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

timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?

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

Ρύθμιση βασικών κανόνων

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