Σήμα — Εντολή Linux/Unix
Linux υποστηρίζει τόσο αξιόπιστα σήματα POSIX (εφεξής «τυπικά σήματα») όσο και σήματα πραγματικού χρόνου POSIX.
Χρήση σημάτων στο Linux
Τα σήματα σε ένα σύστημα Linux το λένε λειτουργικό σύστημα πώς να χειριστείτε ένα πρόγραμμα ή μια διαδικασία που εκτελείται. Όταν κλείνετε ένα πρόγραμμα κανονικά, αυτό στέλνει ένα σήμα στο σύστημα που του λέει να κλείσει το πρόγραμμα. Μπορείτε να το κάνετε και χειροκίνητα.
Ξεκινήστε αναζητώντας μια διαδικασία που θέλετε να τερματίσετε. Μπορείτε να το κάνετε αυτό με:
ps aux | grep -i
Έτσι, εάν θέλετε να κλείσετε τον Firefox από τη γραμμή εντολών, πληκτρολογήστε:
ps aux | grep -i firefox
Θα λάβετε μια τεράστια λίστα διαδικασιών από Firefox επειδή είναι μια εφαρμογή πολλαπλών νημάτων. Αναζητήστε τη βασική διαδικασία για το /usr/lib/firefox. Συνήθως είναι το πρώτο.

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

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

Κάθε σήμα έχει και έναν αντίστοιχο αριθμό για στενογραφία. Ο αριθμός για το SIGTERM είναι 15, ώστε να μπορείτε να τη χρησιμοποιήσετε ακριβώς όπως την πλήρη λέξη.
σκοτώστε -15 4790
Το SIGTERM είναι στην πραγματικότητα η προεπιλεγμένη ενέργεια της εντολής kill. Ως αποτέλεσμα, στην πραγματικότητα δεν χρειάζεται να το προσδιορίσετε καθόλου. Απλώς χρησιμοποιήστε:
σκοτώστε 4790
Θα έχετε το ίδιο ακριβώς αποτέλεσμα.
Όλα αυτά είναι καλά εάν η διαδικασία αποκρίνεται, αλλά πιθανότατα δεν θα κλείσετε μια αποκριτική διαδικασία με αυτόν τον τρόπο, τουλάχιστον όχι σε έναν επιτραπέζιο υπολογιστή. Λοιπόν, τι κάνετε με μια διαδικασία που δεν ανταποκρίνεται; Υπάρχουν πολλά πιθανά σήματα. Για μια καλύτερη ιδέα για το πόσο μεγάλη είναι η γκάμα, αναζητήστε τα.
σκοτώνω -l

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

Όπως και με το 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 χρησιμοποιεί τα τρία πρώτα σήματα σε πραγματικό χρόνο.)
Η προεπιλεγμένη ενέργεια για ένα μη χειριζόμενο σήμα σε πραγματικό χρόνο είναι ο τερματισμός της διαδικασίας λήψης.
Τα σήματα πραγματικού χρόνου διακρίνονται από τα ακόλουθα:
- Πολλαπλές περιπτώσεις σημάτων σε πραγματικό χρόνο μπορούν να τεθούν σε ουρά. Αντίθετα, εάν παραδίδονται πολλαπλές παρουσίες ενός τυπικού σήματος ενώ αυτό το σήμα είναι μπλοκαρισμένο αυτήν τη στιγμή, τότε μόνο ένα στιγμιότυπο βρίσκεται στην ουρά.
- Εάν το σήμα αποστέλλεται χρησιμοποιώντας ουρά(2), μια συνοδευτική τιμή (είτε ακέραιος είτε δείκτης) μπορεί να σταλεί μαζί με το σήμα. Εάν η διαδικασία λήψης δημιουργήσει έναν χειριστή για αυτό το σήμα χρησιμοποιώντας το SA_SIGACTION σημαία σε sigaction(2) τότε μπορεί να λάβει αυτά τα δεδομένα μέσω τουsi_value πεδίο του siginfo_t δομή μεταβιβάστηκε ως το δεύτερο όρισμα στον χειριστή. Επιπλέον, το si_pid και si_uid Τα πεδία αυτής της δομής μπορούν να χρησιμοποιηθούν για τη λήψη του PID και του πραγματικού αναγνωριστικού χρήστη της διαδικασίας που στέλνει το σήμα.
- Τα σήματα σε πραγματικό χρόνο παραδίδονται με εγγυημένη παραγγελία. Πολλαπλά σήματα σε πραγματικό χρόνο του ίδιου τύπου παραδίδονται με τη σειρά που στάλθηκαν. Εάν αποστέλλονται διαφορετικά σήματα πραγματικού χρόνου σε μια διεργασία, παραδίδονται ξεκινώντας με το σήμα με το χαμηλότερο αριθμό. (Δηλαδή, τα σήματα χαμηλού αριθμού έχουν την υψηλότερη προτεραιότητα.)
Εάν εκκρεμούν τόσο τυπικά όσο και σήματα πραγματικού χρόνου για μια διαδικασία, το POSIX αφήνει απροσδιόριστο ποιο θα παραδοθεί πρώτο. Το Linux, όπως και πολλές άλλες υλοποιήσεις, δίνει προτεραιότητα σε τυπικά σήματα σε αυτήν την περίπτωση.
Σύμφωνα με το POSIX, μια υλοποίηση θα πρέπει να επιτρέπει τουλάχιστον _POSIX_SIGQUEUE_MAX (32) σήματα πραγματικού χρόνου να τοποθετούνται σε ουρά σε μια διεργασία. Ωστόσο, αντί να θέτει ένα όριο ανά διεργασία, το Linux επιβάλλει ένα όριο σε όλο το σύστημα στον αριθμό των σημάτων σε πραγματικό χρόνο στην ουρά για όλες τις διεργασίες. Αυτό το όριο μπορεί να προβληθεί (και με προνόμιο) να αλλάξει μέσω του /proc/sys/kernel/rtsig-max αρχείο. Σχετικό αρχείο,/proc/sys/kernel/rtsig-max, μπορεί να χρησιμοποιηθεί για να μάθετε πόσα σήματα σε πραγματικό χρόνο βρίσκονται στην ουρά αυτήν τη στιγμή.
ΣΥΜΜΟΡΦΩΣΗ ΜΕ.
POSIX.1.
Χρησιμοποιήστε το άνδρας εντολή (% άνδρας) για να δείτε πώς χρησιμοποιείται μια εντολή στον συγκεκριμένο υπολογιστή σας.