Σήμα — Εντολή Linux/Unix

Linux υποστηρίζει τόσο αξιόπιστα σήματα POSIX (εφεξής «τυπικά σήματα») όσο και σήματα πραγματικού χρόνου POSIX.

Χρήση σημάτων στο Linux

Τα σήματα σε ένα σύστημα Linux το λένε λειτουργικό σύστημα πώς να χειριστείτε ένα πρόγραμμα ή μια διαδικασία που εκτελείται. Όταν κλείνετε ένα πρόγραμμα κανονικά, αυτό στέλνει ένα σήμα στο σύστημα που του λέει να κλείσει το πρόγραμμα. Μπορείτε να το κάνετε και χειροκίνητα.

Ξεκινήστε αναζητώντας μια διαδικασία που θέλετε να τερματίσετε. Μπορείτε να το κάνετε αυτό με:

ps aux | grep -i 

Έτσι, εάν θέλετε να κλείσετε τον Firefox από τη γραμμή εντολών, πληκτρολογήστε:

ps aux | grep -i firefox

Θα λάβετε μια τεράστια λίστα διαδικασιών από Firefox επειδή είναι μια εφαρμογή πολλαπλών νημάτων. Αναζητήστε τη βασική διαδικασία για το /usr/lib/firefox. Συνήθως είναι το πρώτο.

Λίστα διαδικασιών Linux Firefox

Εάν το βρίσκετε συντριπτικό, μπορείτε επίσης να το χρησιμοποιήσετε pgrep. Λειτουργεί παρόμοια, αλλά σας δίνει μόνο τα αναγνωριστικά της διαδικασίας.

pgrep firefox. 

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

Linux pgrep Firefox

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

kill -SIGTERM 4790. 
Linux SIGTERM Firefox

Κάθε σήμα έχει και έναν αντίστοιχο αριθμό για στενογραφία. Ο αριθμός για το SIGTERM είναι 15, ώστε να μπορείτε να τη χρησιμοποιήσετε ακριβώς όπως την πλήρη λέξη.

σκοτώστε -15 4790

Το SIGTERM είναι στην πραγματικότητα η προεπιλεγμένη ενέργεια της εντολής kill. Ως αποτέλεσμα, στην πραγματικότητα δεν χρειάζεται να το προσδιορίσετε καθόλου. Απλώς χρησιμοποιήστε:

σκοτώστε 4790

Θα έχετε το ίδιο ακριβώς αποτέλεσμα.

Όλα αυτά είναι καλά εάν η διαδικασία αποκρίνεται, αλλά πιθανότατα δεν θα κλείσετε μια αποκριτική διαδικασία με αυτόν τον τρόπο, τουλάχιστον όχι σε έναν επιτραπέζιο υπολογιστή. Λοιπόν, τι κάνετε με μια διαδικασία που δεν ανταποκρίνεται; Υπάρχουν πολλά πιθανά σήματα. Για μια καλύτερη ιδέα για το πόσο μεγάλη είναι η γκάμα, αναζητήστε τα.

σκοτώνω -l
Λίστα σημάτων Linux

Ναι, υπάρχουν πολλά. Ευτυχώς, δεν θα αγγίξετε τη συντριπτική πλειοψηφία, εκτός και αν αρχίσετε να αναπτύσσετε ή να γράφετε σενάρια διαχείρισης συστήματος. Τις περισσότερες φορές, όταν το SIGTERM αποτυγχάνει να σταματήσει μια διαδικασία που δεν ανταποκρίνεται, θα αναζητήσετε το αντίστοιχο Linux Ctrl+Alt+Delete, ΣΙΓΚΙΛ.

Σε αντίθεση με τον περίφημο διαχειριστή διεργασιών Ctrl+Alt+Delete, το SIGKILL λειτουργεί στην πραγματικότητα. Στην πραγματικότητα, έχει σκοπό να αγνοήσει όλους τους άλλους παράγοντες και να καταργήσει τη διαδικασία προσβολής, ανεξάρτητα από το τι. Αυτό σημαίνει επίσης ότι το SIGKILL μπορεί να είναι επικίνδυνο εάν κάνετε λάθος τη διαδικασία.

Ξεκινήστε με τον ίδιο ακριβώς τρόπο, αναζητώντας το αναγνωριστικό της διαδικασίας.

pgrep firefox

Τώρα, αντί να χρησιμοποιήσετε το SIGTERM για να σταματήσετε τη διαδικασία, χρησιμοποιήστε το πιο καταστροφικό SIGKILL.

kill -SIGKILL 4790

Ακόμα κι αν η διαδικασία είναι εντελώς κλειδωμένη, θα πρέπει να κλείσει μέσα σε λίγα δευτερόλεπτα.

Linux SIGKILL Firefox

Όπως και με το SIGTERM, υπάρχει ένας αριθμός που αντιστοιχεί στο SIGKILL. Σε αυτή την περίπτωση, είναι 9.

σκοτώστε -9 4790

Ακριβώς όπως πριν, η διαδικασία θα πρέπει να είναι νεκρή σχεδόν αμέσως.

Θα πρέπει επίσης να γνωρίζετε ΣΗΜΕΙΩΣΗ. Αυτή είναι μια διακοπή από το πληκτρολόγιο και είναι περισσότερη εντολή από ό, τι νομίζετε στη γραμμή εντολών. Όταν πατάτε Ctrl+C για να διακόψετε μια διαδικασία από ένα παράθυρο τερματικού, στην πραγματικότητα εκδίδετε ένα SIGINT. Ο κωδικός του είναι 2, και μπορείτε να το χρησιμοποιήσετε ακριβώς όπως τα άλλα με την εντολή kill.

σκοτώστε -2 4790

Αυτό δεν είναι πολύ συνηθισμένο, καθώς είναι πολύ πιο πιθανό να πάτε μαζί Ctrl+C, αλλά είναι καλό να το γνωρίζεις.

Αυτά είναι μακράν τα πιο κοινά σήματα που θα συναντήσετε στην καθημερινή σας χρήση Linux. Για μια πιο τεχνική ανάλυση των άλλων σημάτων, συνεχίστε στην επόμενη ενότητα.

Τα Τεχνικά Στοιχεία

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

Τυπικά σήματα

Το Linux υποστηρίζει τα τυπικά σήματα που αναφέρονται παρακάτω. Πολλοί αριθμοί σήματος εξαρτώνται από την αρχιτεκτονική, όπως υποδεικνύεται στη στήλη "Τιμή". (Όταν δίνονται τρεις τιμές, η πρώτη ισχύει συνήθως για το alpha και το sprc, η μεσαία για i386, ppc και sh και η τελευταία για mips. A - σημαίνει ότι ένα σήμα απουσιάζει στην αντίστοιχη αρχιτεκτονική.)

Οι καταχωρήσεις στη στήλη "Ενέργεια" του πίνακα καθορίζουν την προεπιλεγμένη ενέργεια για το σήμα, ως εξής:

Ορος:Η προεπιλεγμένη ενέργεια είναι ο τερματισμός της διαδικασίας.

Ign:Η προεπιλεγμένη ενέργεια είναι να αγνοήσετε το σήμα.

Πυρήνας:Η προεπιλεγμένη ενέργεια είναι ο τερματισμός της διαδικασίας και η απόρριψη του πυρήνα.

Να σταματήσει:Η προεπιλεγμένη ενέργεια είναι η διακοπή της διαδικασίας.

Πρώτον, τα σήματα που περιγράφονται στο αρχικό πρότυπο POSIX.1.

Σήμα αξία Δράση Σχόλιο
ή θάνατος της διαδικασίας ελέγχου
ΣΗΜΕΙΩΣΗ 2 Ορος Διακοπή από το πληκτρολόγιο
SIGQUIT 3 Πυρήνας Έξοδος από το πληκτρολόγιο
ΣΙΓΙΛ 4 Πυρήνας Παράνομη Οδηγία
SIGABRT 6 Πυρήνας Ακύρωση σήματος από κάνω αποβολή(3)
ΣΙΓΦΠΕ 8 Πυρήνας Εξαίρεση κινητής υποδιαστολής
ΣΙΓΚΙΛ 9 Ορος Σήμα Kill
SIGSEGV 11 Πυρήνας Μη έγκυρη αναφορά μνήμης
SIGPIPE 13 Ορος Σπασμένος σωλήνας: εγγραφή σε σωλήνα χωρίς αναγνώστες
SIGALRM 14 Ορος Σήμα χρονοδιακόπτη από τρομάζω(2)
SIGTERM 15 Ορος Σήμα τερματισμού
SIGUSR1 30,10,16 Ορος Σήμα που καθορίζεται από το χρήστη 1
SIGUSR2 31,12,17 Ορος Σήμα που καθορίζεται από το χρήστη 2
SIGCHLD 20,17,18 Ign Το παιδί σταμάτησε ή τερματίστηκε
SIGCONT 19,18,25 Συνεχίστε αν σταματήσει
SIGSTOP 17,19,23 Να σταματήσει Διακοπή διαδικασίας
SIGTSTP 18,20,24 Να σταματήσει Σταματήστε να πληκτρολογείτε στο tty
SIGTTIN 21,21,26 Να σταματήσει tty είσοδο για τη διαδικασία παρασκηνίου
ΣΙΓΤΤΟΥ 22,22,27 Να σταματήσει tty έξοδο για τη διαδικασία παρασκηνίου

Τα σήματα ΣΙΓΚΙΛ και SIGSTOP δεν μπορεί να συλληφθεί, να αποκλειστεί ή να αγνοηθεί.

Στη συνέχεια, τα σήματα δεν είναι στο πρότυπο POSIX.1 αλλά περιγράφονται στα SUSv2 και SUSv3 / POSIX 1003.1-2001.

Σήμα αξία Δράση Σχόλιο
SIGPOLL Ορος Συμβάν με δυνατότητα μέτρησης (Sys V). Συνώνυμο του SIGIO
ΣΙΓΠΡΟΦ 27,27,29 Ορος Ο χρονοδιακόπτης προφίλ έληξε
ΣΙΓΣΥΣ 12,-,12 Πυρήνας Κακό επιχείρημα στη ρουτίνα (SVID)
SIGTRAP 5 Πυρήνας Παγίδα ίχνους/σημείου διακοπής
SIGURG 16,23,21 Ign Επείγουσα κατάσταση στην πρίζα (4,2 BSD)
SIGVTALRM 26,26,28 Ορος Εικονικό ξυπνητήρι (4,2 BSD)
SIGXCPU 24,24,30 Πυρήνας Υπέρβαση του χρονικού ορίου CPU (4,2 BSD)
SIGXFSZ 25,25,31 Πυρήνας Υπέρβαση του ορίου μεγέθους αρχείου (4,2 BSD)

Έως και συμπεριλαμβανομένου του Linux 2.2, η προεπιλεγμένη συμπεριφορά για ΣΙΓΣΥΣ, SIGXCPU, SIGXFSZ, και (σε ​​αρχιτεκτονικές άλλες από το SPARC και το MIPS) SIGBUS επρόκειτο να τερματιστεί η διαδικασία (χωρίς βασική χωματερή). (Σε ορισμένα άλλα Unices η προεπιλεγμένη ενέργεια για SIGXCPU και SIGXFSZ είναι ο τερματισμός της διαδικασίας χωρίς ένδειξη πυρήνα.) Το Linux 2.4 συμμορφώνεται με τις απαιτήσεις του POSIX 1003.1-2001 για αυτά τα σήματα, τερματίζοντας τη διαδικασία με μια ένδειξη πυρήνα.

Στη συνέχεια, διάφορα άλλα σήματα.

Σήμα αξία Δράση Σχόλιο
SIGEMT 7,-,7 Ορος
SIGSTKFLT -,16,- Ορος Σφάλμα στοίβας στον συνεπεξεργαστή (αχρησιμοποίητο)
SIGIO 23,29,22 Ορος Δυνατότητα εισόδου/εξόδου (4,2 BSD)
SIGCLD -,-,18 Ign Συνώνυμο του SIGCHLD
SIGPWR 29,30,19 Ορος Διακοπή ρεύματος (Σύστημα V)
SIGINFO 29,-,- Συνώνυμο του SIGPWR
SIGLOST -,-,- Ορος Το κλείδωμα του αρχείου χάθηκε
SIGWINCH 28,28,20 Ign Σήμα αλλαγής μεγέθους παραθύρου (4,3 BSD, Sun)
ΥΠΟΓΡΑΦΗΜΕΝΟ -,31,- Ορος Μη χρησιμοποιημένο σήμα (θα είναι SIGSYS)

(Το σήμα 29 είναι SIGINFO / SIGPWR σε ένα άλφα αλλά SIGLOST σε ένα spark.)

SIGEMT δεν καθορίζεται στο POSIX 1003.1-2001, αλλά εμφανίζεται ωστόσο στα περισσότερα άλλα Unices, όπου η προεπιλεγμένη δράση του είναι συνήθως ο τερματισμός της διαδικασίας με μια ένδειξη πυρήνα.

SIGPWR (το οποίο δεν προσδιορίζεται στο POSIX 1003.1-2001) συνήθως αγνοείται από προεπιλογή σε εκείνα τα άλλα Unices όπου εμφανίζεται.

SIGIO (το οποίο δεν προσδιορίζεται στο POSIX 1003.1-2001) αγνοείται από προεπιλογή σε πολλά άλλα Unice.

Σήματα σε πραγματικό χρόνο

Το Linux υποστηρίζει σήματα πραγματικού χρόνου όπως ορίστηκαν αρχικά στις επεκτάσεις πραγματικού χρόνου POSIX.4 (και τώρα περιλαμβάνονται στο POSIX 1003.1-2001). Το Linux υποστηρίζει 32 σήματα σε πραγματικό χρόνο, αριθμημένα από 32 (SIGRTMIN) έως 63 (SIGRTMAX). (Τα προγράμματα θα πρέπει πάντα να αναφέρονται σε σήματα πραγματικού χρόνου χρησιμοποιώντας σημειογραφία SIGRTMIN+n, καθώς το εύρος των αριθμών σήματος σε πραγματικό χρόνο ποικίλλει μεταξύ των Unices.)

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

Η προεπιλεγμένη ενέργεια για ένα μη χειριζόμενο σήμα σε πραγματικό χρόνο είναι ο τερματισμός της διαδικασίας λήψης.

Τα σήματα πραγματικού χρόνου διακρίνονται από τα ακόλουθα:

  1. Πολλαπλές περιπτώσεις σημάτων σε πραγματικό χρόνο μπορούν να τεθούν σε ουρά. Αντίθετα, εάν παραδίδονται πολλαπλές παρουσίες ενός τυπικού σήματος ενώ αυτό το σήμα είναι μπλοκαρισμένο αυτήν τη στιγμή, τότε μόνο ένα στιγμιότυπο βρίσκεται στην ουρά.
  2. Εάν το σήμα αποστέλλεται χρησιμοποιώντας ουρά(2), μια συνοδευτική τιμή (είτε ακέραιος είτε δείκτης) μπορεί να σταλεί μαζί με το σήμα. Εάν η διαδικασία λήψης δημιουργήσει έναν χειριστή για αυτό το σήμα χρησιμοποιώντας το SA_SIGACTION σημαία σε sigaction(2) τότε μπορεί να λάβει αυτά τα δεδομένα μέσω τουsi_value πεδίο του siginfo_t δομή μεταβιβάστηκε ως το δεύτερο όρισμα στον χειριστή. Επιπλέον, το si_pid και si_uid Τα πεδία αυτής της δομής μπορούν να χρησιμοποιηθούν για τη λήψη του PID και του πραγματικού αναγνωριστικού χρήστη της διαδικασίας που στέλνει το σήμα.
  3. Τα σήματα σε πραγματικό χρόνο παραδίδονται με εγγυημένη παραγγελία. Πολλαπλά σήματα σε πραγματικό χρόνο του ίδιου τύπου παραδίδονται με τη σειρά που στάλθηκαν. Εάν αποστέλλονται διαφορετικά σήματα πραγματικού χρόνου σε μια διεργασία, παραδίδονται ξεκινώντας με το σήμα με το χαμηλότερο αριθμό. (Δηλαδή, τα σήματα χαμηλού αριθμού έχουν την υψηλότερη προτεραιότητα.)

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

Σύμφωνα με το POSIX, μια υλοποίηση θα πρέπει να επιτρέπει τουλάχιστον _POSIX_SIGQUEUE_MAX (32) σήματα πραγματικού χρόνου να τοποθετούνται σε ουρά σε μια διεργασία. Ωστόσο, αντί να θέτει ένα όριο ανά διεργασία, το Linux επιβάλλει ένα όριο σε όλο το σύστημα στον αριθμό των σημάτων σε πραγματικό χρόνο στην ουρά για όλες τις διεργασίες. Αυτό το όριο μπορεί να προβληθεί (και με προνόμιο) να αλλάξει μέσω του /proc/sys/kernel/rtsig-max αρχείο. Σχετικό αρχείο,/proc/sys/kernel/rtsig-max, μπορεί να χρησιμοποιηθεί για να μάθετε πόσα σήματα σε πραγματικό χρόνο βρίσκονται στην ουρά αυτήν τη στιγμή.

ΣΥΜΜΟΡΦΩΣΗ ΜΕ.

POSIX.1.

Χρησιμοποιήστε το άνδρας εντολή (% άνδρας) για να δείτε πώς χρησιμοποιείται μια εντολή στον συγκεκριμένο υπολογιστή σας.