Σειρά RHCSA: Διαχείριση διεργασιών στο RHEL 7: Εκκίνηση, τερματισμός λειτουργίας και τα πάντα στο μεταξύ – Μέρος 5


Θα ξεκινήσουμε αυτό το άρθρο με μια συνολική και σύντομη αναθεώρηση του τι συμβαίνει από τη στιγμή που πατάτε το κουμπί Λειτουργία για να ενεργοποιήσετε τον διακομιστή σας RHEL 7 μέχρι να εμφανιστεί η σύνδεση οθόνη σε μια διεπαφή γραμμής εντολών.

Παρακαλούμε να σημειώσετε ότι:

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

Διαδικασία εκκίνησης Linux

1. Το POST (Power On Self Test) προετοιμάζει και εκτελεί ελέγχους υλικού.

2. Όταν τελειώσει το POST, ο έλεγχος συστήματος μεταβιβάζεται στον φορτωτή εκκίνησης πρώτου σταδίου, ο οποίος αποθηκεύεται είτε στον τομέα εκκίνησης ενός από τους σκληρούς δίσκους (για παλαιότερους συστήματα που χρησιμοποιούν BIOS και MBR), ή ένα αποκλειστικό διαμέρισμα (U)EFI.

3. Στη συνέχεια, ο φορτωτής εκκίνησης πρώτου σταδίου φορτώνει τον φορτωτή εκκίνησης δεύτερου σταδίου, συνήθως το GRUB (GRand Unified Boot Loader), το οποίο βρίσκεται μέσα στο /boot, το οποίο με τη σειρά του φορτώνει τον πυρήνα και το αρχικό σύστημα αρχείων που βασίζεται σε RAM (επίσης γνωστό ως initramfs, το οποίο περιέχει προγράμματα και δυαδικά αρχεία που εκτελούν τις απαραίτητες ενέργειες που απαιτούνται για να προσαρτήστε το πραγματικό ριζικό σύστημα αρχείων).

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

5. Ο πυρήνας ρυθμίζει το υλικό που είναι συνδεδεμένο στο σύστημα και μόλις προσαρτηθεί το ριζικό σύστημα αρχείων, εκκινεί τη διαδικασία με PID 1, η οποία με τη σειρά της θα προετοιμάσει άλλες διεργασίες και θα παρουσιάσει μας με μια προτροπή σύνδεσης.

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

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

ps -o ppid,pid,uname,comm --ppid=1

Να θυμάστε ότι η σημαία -o (συντομογραφία του –format) σας επιτρέπει να παρουσιάζετε την έξοδο του ps σε προσαρμοσμένη μορφή που ταιριάζει στις ανάγκες σας χρησιμοποιώντας τις λέξεις-κλειδιά που καθορίζονται στην ενότητα ΠΡΟΔΙΑΓΡΑΦΕΣ ΤΥΠΟΥ ΜΟΡΦΗΣ στο man ps.

Μια άλλη περίπτωση στην οποία θα θέλετε να ορίσετε την έξοδο του ps αντί να ακολουθήσετε την προεπιλογή είναι όταν πρέπει να βρείτε διεργασίες που προκαλούν σημαντικό φορτίο CPU ή/και μνήμης και να τις ταξινομήσετε ανάλογα:

ps aux --sort=+pcpu              # Sort by %CPU (ascending)
ps aux --sort=-pcpu              # Sort by %CPU (descending)
ps aux --sort=+pmem              # Sort by %MEM (ascending)
ps aux --sort=-pmem              # Sort by %MEM (descending)
ps aux --sort=+pcpu,-pmem        # Combine sort by %CPU (ascending) and %MEM (descending)

Εισαγωγή στο SystemD

Λίγες αποφάσεις στον κόσμο του Linux έχουν προκαλέσει περισσότερες διαμάχες από την υιοθέτηση του systemd από μεγάλες διανομές Linux. Οι υποστηρικτές του Systemd αναφέρουν ως κύρια πλεονεκτήματά του τα ακόλουθα γεγονότα:

Διαβάστε επίσης: The Story Behind "init" and "systemd"

1. Το Systemd επιτρέπει την παράλληλη διεκπεραίωση περισσότερων επεξεργασιών κατά την εκκίνηση του συστήματος (σε αντίθεση με το παλαιότερο SysVinit, το οποίο τείνει πάντα να είναι πιο αργό επειδή ξεκινά τις διαδικασίες μία προς μία, ελέγχει εάν το ένα εξαρτάται από το άλλο και μετά περιμένει να ξεκινήσουν οι δαίμονες ώστε να ξεκινήσουν περισσότερες υπηρεσίες), και

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

3. Συμβατότητα προς τα πίσω με σενάρια SysVinit.

Το Systemd ελέγχεται από το βοηθητικό πρόγραμμα systemctl. Εάν προέρχεστε από ένα υπόβαθρο SysVinit, το πιθανότερο είναι ότι θα είστε εξοικειωμένοι με:

  1. το εργαλείο service, το οποίο -σε αυτά τα παλαιότερα συστήματα- χρησιμοποιήθηκε για τη διαχείριση σεναρίων SysVinit και
  2. το βοηθητικό πρόγραμμα chkconfig, το οποίο εξυπηρετούσε τον σκοπό ενημέρωσης και αναζήτησης πληροφοριών επιπέδου εκτέλεσης για υπηρεσίες συστήματος.
  3. τερματισμός, τον οποίο πρέπει να έχετε χρησιμοποιήσει αρκετές φορές είτε για επανεκκίνηση είτε για διακοπή ενός συστήματος που λειτουργεί.

Ο παρακάτω πίνακας δείχνει τις ομοιότητες μεταξύ της χρήσης αυτών των εργαλείων παλαιού τύπου και του systemctl:

Legacy tool Systemctl equivalent Description
service name start systemctl start name Start name (where name is a service)
service name stop systemctl stop name Stop name
service name condrestart systemctl try-restart name Restarts name (if it’s already running)
service name restart systemctl restart name Restarts name
service name reload systemctl reload name Reloads the configuration for name
service name status systemctl status name Displays the current status of name
service –status-all systemctl Displays the status of all current services
chkconfig name on systemctl enable name Enable name to run on startup as specified in the unit file (the file to which the symlink points). The process of enabling or disabling a service to start automatically on boot consists in adding or removing symbolic links inside the /etc/systemd/system directory.
chkconfig name off systemctl disable name Disables name to run on startup as specified in the unit file (the file to which the symlink points)
chkconfig –list name systemctl is-enabled name Verify whether name (a specific service) is currently enabled
chkconfig –list systemctl –type=service Displays all services and tells whether they are enabled or disabled
shutdown -h now systemctl poweroff Power-off the machine (halt)
shutdown -r now systemctl reboot Reboot the system

Το Systemd εισήγαγε επίσης τις έννοιες των μονάδων (που μπορεί να είναι είτε μια υπηρεσία, ένα σημείο προσάρτησης, μια συσκευή ή μια υποδοχή δικτύου) και οι στόχοι (με τον τρόπο που το systemd καταφέρνει να ξεκινήσει πολλές σχετικές διαδικασίες ταυτόχρονα χρόνο και μπορεί να θεωρηθεί -αν και όχι ίσο- ως το ισοδύναμο των επιπέδων εκτέλεσης σε συστήματα βασισμένα σε SysVinit.

Ανακεφαλαίωση

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

1. Προσαρμόστε την προτεραιότητα εκτέλεσης όσον αφορά τη χρήση πόρων συστήματος μιας διαδικασίας:

Αυτό επιτυγχάνεται μέσω του βοηθητικού προγράμματος renice, το οποίο αλλάζει την προτεραιότητα προγραμματισμού μιας ή περισσότερων διεργασιών που εκτελούνται. Με απλά λόγια, η προτεραιότητα προγραμματισμού είναι ένα χαρακτηριστικό που επιτρέπει στον πυρήνα (που υπάρχει στις εκδόσεις => 2.6) να εκχωρεί πόρους συστήματος σύμφωνα με την εκχωρημένη προτεραιότητα εκτέλεσης (γνωστός και ως ωραίος, σε ένα εύρος από -20 έως 19) μιας δεδομένης διαδικασίας.

Η βασική σύνταξη του renice είναι η εξής:

renice [-n] priority [-gpu] identifier

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

2. Σκοτώστε (ή διακόψτε την κανονική εκτέλεση) μιας διαδικασίας όπως απαιτείται:

Με πιο ακριβείς όρους, η θανάτωση μιας διαδικασίας δίνει το δικαίωμα να της στείλει ένα σήμα είτε να ολοκληρώσει την εκτέλεσή της με χάρη (SIGTERM=15) είτε αμέσως (SIGKILL=9) μέσω του kill ή του pkill εντολές.

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

Επιπλέον, το pkill συνοδεύεται από το pgrep, το οποίο σας δείχνει τα PID που θα επηρεαστούν σε περίπτωση χρήσης του pkill. Για παράδειγμα, πριν από την εκτέλεση:

pkill -u gacanepa

Μπορεί να είναι χρήσιμο να δείτε με μια ματιά ποια είναι τα PID που ανήκουν στον gacanepa:

pgrep -l -u gacanepa

Από προεπιλογή, τόσο το kill όσο και το pkill στέλνουν το σήμα SIGTERM στη διαδικασία. Όπως αναφέραμε παραπάνω, αυτό το σήμα μπορεί να αγνοηθεί (ενώ η διεργασία τελειώνει την εκτέλεσή της ή οριστικά), οπότε όταν πρέπει σοβαρά να διακόψετε μια διεργασία που εκτελείται με έγκυρο λόγο, θα πρέπει να καθορίσετε το SIGKILL σήμα στη γραμμή εντολών:

kill -9 identifier               # Kill a process or a process group
kill -s SIGNAL identifier        # Idem
pkill -s SIGNAL identifier       # Kill a process by name or other attributes 

συμπέρασμα

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

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