Διαχείριση διεργασιών

Εικόνα: markos
Submitted by markos on Τρι, 06/03/2007 - 02:15

Περί διεργασιών

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

Στα παλαιότερα λειτουργικά συστήματα (MS-DOS, CP/M) αλλά και σε οικιακούς υπολογιστές που δεν είχαν κάποιο ξεχωριστό λειτουργικό σύστημα (Spectrum, Amstrad, Commodore, κλπ), το κάθε πρόγραμμα που έτρεχε είχε πλήρη έλεγχο του υπολογιστή, δηλαδή του επεξεργαστή και του συνδεδεμένου υλικού, και δεν ήταν δυνατή η εκτέλεση δύο προγραμμάτων ταυτόχρονα στον ίδιο τον υπολογιστή. Το πρόγραμμα δε μοιραζόταν το χρόνο του επεξεργαστή και έτσι είχε τη δυνατότητα να κάνει αρκετές υποθέσεις και παραδοχές όσον αφορά τις απαιτήσεις του και την αρχιτεκτονική του υπολογιστή.

Η εξέλιξη των υπολογιστών, η εμφάνιση γρήγορών επεξεργαστών και οι αυξημένες απαιτήσεις οδήγησαν στην εμφάνιση πολυδιεργαστικών λειτουργικών συστήματων (multi-tasking operating systems) τα οποία επέτρεπαν την παράλληλη εκτέλεση πολλών προγραμμάτων. Αυτά τα προγράμματα που εκτελούνται παράλληλα σε ένα τέτοιο λειτουργικό σύστημα αποτελούν τις διεργασίες. Στην πραγματικότητα δεν τρέχουν πραγματικά παράλληλα, αλλά το λειτουργικό σύστημα μοιράζει το χρόνο του επεξεργαστή έτσι που κάθε στιγμή τρέχει μόνο μια διεργασία, και για εκείνη τη στιγμή έχει το σχεδόν πλήρη έλεγχο του επεξεργαστή. Το λειτουργικό σύστημα πραγματοποιεί μερικές εκατοντάδες ώς χιλιάδες εναλλαγές το δευτερόλεπτο, έτσι που στο χρήστη φαίνεται ότι εκτελούνται παράλληλα. Ακόμη και έτσι όμως, ο χρόνος που είναι διαθέσιμος από τον επεξεργαστή εξαρτάται από το φόρτο του, ή για την ακρίβεια από την απαίτηση της κάθε διεργασίας για επεξεργαστική ισχύ.

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

Σε όλα τα πολυδιεργαστικά λειτουργικά συστήματα, όπως τα συστήματα UNIX και Linux, την όλη διαχείριση των διεργασιών την αναλαμβάνει ο πυρήνας. Για το σκοπό αυτό, κρατά μια λίστα διεργασιών, από την οποία λαμβάνει με τη σειρά κάθε διεργασία και την εκτελεί για ένα χρονικό διάστημα (συνήθως κάποια χιλιοστά του δευτερολέπτου). Στη συνέχεια θέτει την διεργασία αυτή σε νάρκη (sleep mode) και εκτελεί την επόμενη, κ.ο.κ. Οι ίδιες οι διεργασίες δεν έχουν έλεγχο πόσο χρόνο θα δεσμεύσουν από τον επεξεργαστή και πότε. Παλαιότερα, κάθε διεργασία είχε ίση μεταχείριση από τον πυρήνα, δηλαδή δέσμευε τον ίδιο χρόνο με τις άλλες διεργασίες. Κάτι τέτοιο όμως δεν είναι ιδιαίτερα αποδοτικό, αφού συχνά κάποιες διεργασίες βρίσκονται σε κατάσταση αναμονής (wait mode) ενώ κάποιες άλλες χρειάζονται όσο το δυνατόν περισσότερη επεξεργαστική ισχύ (π.χ. κάποιο πρόγραμμα rendering). Αντίστροφα, σε ορισμένες διεργασίες ο χρόνος απόκρισης είναι ιδιαίτερα σημαντικός (π.χ. η διεργασία που χειρίζεται το πληκτρολόγιο ή τους δίσκους) ενώ σε άλλες δεν παίζει ρόλο.

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

Είδη διεργασιών

Γενικά, όσον αφορά τον πυρήνα, όλες οι διεργασίες είναι ίδιες. Το μόνο που επηρεάζει τον πυρήνα για την δέσμευση χρόνου για κάθε διεργασία είναι η προτεραιότητά της. Υπάρχουν όμως ορισμένα χαρακτηριστικά των διεργασιών που τις κατηγοριοποιούν, κυρίως για λόγους διαχείρισης.
Κάθε διεργασία που έχει κάποιου είδους άμεση αλληλεπίδραση με το χρήστη (μέσω πληκτρολογίου, ποντικιού ή άλλης συσκευής) λέγεται διαδραστική (interactive). Ένα παράδειγμα διαδραστικής διεργασίας είναι το ίδιο το κέλυφος αλλά και το σύστημα παραθύρων X.

Οι μη διαδραστικές διεργασίες μπορεί να είναι απλά σενάρια κελύφους που εκτελούνται από το χρήστη ή σε τακτά χρονικά διαστήματα από ένα σύστημα όπως το CRON, ή ακόμη και προγράμματα που τρέχουν συνεχώς και αναλαμβάνουν κάποια υπηρεσία, όπως οι διακομιστές αλληλογραφίας (email servers) ή ιστοσελίδων (web servers). Οι τελευταίοι καλούνται και δαίμονες (daemons).

Κάθε διεργασία μπορεί να ξεκινήσει μια άλλη διεργασία. Οι δύο διεργασίες ονομάζονται αντίστοιχα γονική και θυγατρική (parent και child process). Όλες οι διεργασίες στο Linux έχουν μια τέτοια σχέση καθώς δημιουργούνται από την init, που είναι η γονική διεργασία όλων των υπολοίπων, όπως θα δούμε παρακάτω με την pstree. Αν η θυγατρική διεργασία είναι η ίδια με την γονική, τότε η διαδικασία λέγεται διακλάδωση διεργασίών (process forking).

Σε κάθε διεργασία αντιστοιχεί και ενα αριθμός ταυτότητας (process id) που πιο συχνά θα το δούμε ως PID. Σε κάθε στιγμή ο αριθμός αυτός είναι μοναδικός για την κάθε διεργασία, αλλά καθώς το εύρος τους είναι περιορισμένο (1- 32767) και ένα σύστημα μπορεί να έχει μεγάλο χρόνο λειτουργίας, θα δούμε τους αριθμούς αυτούς να επαναλαμβάνονται. Κάτι τέτοιο είναι φυσιολογικό και είναι τακτική που ακολουθείται σε όλα τα λειτουργικά συστήματα.

Παρόμοιοι περιορισμοί πρόσβασης για τους χρήστες ισχύουν και για τις διεργασίες. Ένας χρήστες δε μπορεί να τερματίσει μια διεργασία κάποιου άλλου χρήστη ούτε να της αλλάξει την προτεραιότητα, εκτός αν είναι ο χρήστης root.

Η εντολή ps

Για την εμφάνιση των διεργασιών που τρέχουν σε κάθε στιγμή στο σύστημα μπορούμε να χρησιμοποιήσουμε την εντολή ps, η οποία μπορεί να εμφανίσει ένα πλήθος πληροφοριών για την κάθε διεργασία, όπως το χρόνο εκτέλεσης, το συνολικό ποσοστό του χρόνου του επεξεργαστή που έχει χρησιμοποιήσει (CPU usage), το ποσό της μνήμης που καταναλώνει (memory usage), κλπ.

Η σύνταξη της ps είναι κάπως διαφορετική από των άλλων εντολών, για ιστορικούς λόγους. Το BSD UNIX ακολούθησε διαφορετική σύνταξη από το System V και η ps που περιλαμβάνεται στο Linux υποστηρίζει και τις δύο συντάξεις καθώς και μια ακόμη συμβατή με τα πρότυπα GNU. Οι διαφορές είναι ότι η σύνταξη BSD δε χρησιμοποιεί την παύλα “-” για τον ορισμό επιλογών, ενώ η σύνταξη System V χρησιμοποιεί. Η σύνταξη GNU χρησιμοποιεί δύο παύλες “--”.

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

Επιλογές
Λειτουργία
-A
-e
Εμφανίζει όλες τις διεργασίες του συστήματος.
a Εμφανίζει όλες τις διεργασίες που είναι συνδεδεμένες σε κάποιο τερματικό, ακόμη και άλλων χρηστών.
r Εμφανίζει μόνο τις διεργασίες που τρέχουν αυτή τη στιγμή, δηλαδή που δεν βρίσκονται σε κατάσταση αναμονής.
x Εμφανίζει τις διεργασίες που δεν είναι συνδεδεμένες σε κάποιο τερματικό.
-C cmd Εμφανίζει την διεργασία που αντιστοιχεί στην εντολή cmd.
u user
-u user
--user user
Εμφανίζει τις διεργασίες που αντιστοιχούν στο χρήστη user. Δέχεται όνομα χρήστη ή uid.
g group
-g group
--group group
Εμφανίζει τις διεργασίες που αντιστοιχούν στην ομάδα group. Δέχεται όνομα ομάδας ή gid.
p pid
-p pid
--pid pid
Εμφανίζει τις διεργασίες που αντιστοιχούν στα δοσμένα pid. Λειτουργεί και δίνοντας απευθείας το pid χωρίς επιλογή. Για παράδειγμα, δίνοντας απλώς 322, θα εμφανίσει πληροφορίες για την διεργασία με process id 322.
t tty
-t tty
--tty tty
Εμφανίζει τις διεργασίες που αντιστοιχούν στο τερματικό tty.
--ppid pid Εμφανίζει τις διεργασίες που έχουν ως γονική διεργασία την pid.
l
-l
Εμφανίζει εκτεταμένες πληροφορίες για κάθε διεργασία.
-f Η εμφάνιση να γίνει με όλες τις πληροφορίες για κάθε διεργασία.
-F Εμφανίζει επιπλέον πληροφορίες από τη -f.
F
--forest
-H
Εμφανίζει τις διεργασίες ιεραρχικά, με τρόπο που να φαίνεται η σχέση γονικών-θυγατρικών διεργασιών.
--sort Ταξινομεί τη λίστα με βάση τα δεδομένα στοιχεία-κλειδιά. Δέχεται δύο μορφές: μία σύντομη και μία πλήρη. Μερικά από τα κλειδιά ταξινόμησης είναι (σε παρένθεση η σύντομη μορφή):

  • cmd(c) : όνομα εντολής (μόνο το όνομα της εντολής)
  • cmdline(C) : όνομα εντολής (πλήρης)
  • pid(p) : το process id
  • ppid(P) : το process id της γονικής διεργασίας
  • utime(k) : πραγματικός χρονος επεξεργασίας
  • stime(K) : χρόνος επεξεργασίας συστήματος
  • size(s) : μέγεθος κατανάλωσης μνήμης της διεργασίας (σε kilobytes)
  • user(u) : όνομα χρήστη
  • uid(U) : αριθμός ταυτότητας χρήστη.

Ακολουθούν μερικά παραδείγματα της χρήσης της εντολής.

$ ps -HeF

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

$ ps -fC syslogd
UID        PID  PPID  C STIME TTY          TIME CMD
root       280     1  0 Jul12 ?        00:00:02 /sbin/syslogd

Εμφανίζει μόνο την εντολή syslogd.

$ ps -FC syslogd
UID        PID  PPID  C    SZ  RSS PSR STIME TTY          TIME CMD
root       280     1  0   325  540   0 Jul12 ?        00:00:02 /sbin/syslogd

Η ίδια αλλά με την επιλογή -F, που εμφανίζει περισσότερες πληροφορίες.
Το δέντρο ιεραρχίας των εντολών μπορούμε να το λάβουμε και με την εντολή pstree (περιέχεται στο πακέτο psmisc). Παράδειγμα:

$ pstree
init─┬─acpid
     ├─alarmd
     ├─apache───5*[apache]
     ├─atd
     ├─atop
     ├─bash───startx───xinit─┬─XFree86
     │                       └─x-session-manag─┬─ksmserver
     │                                         └─ssh-agent
     ├─bdflush
     ├─cron
     ├─cupsd
     ├─devfsd
     ├─5*[getty]
     ├─inetd
     ├─kdeinit─┬─artsd
     │         ├─kdeinit
     │         ├─kdeinit─┬─2*[bash]
     │         │         ├─bash───pstree
     │         │         ├─bash───bash───man───sh───pager
     │         │         └─bash───bash───tail
     │         ├─kghostview───gs
     │         └─soffice.bin───soffice.bin───4*[soffice.bin]

Το σύστημα αρχείων /proc και οι διεργασίες

Η έκδοση της ps που χρησιμοποιεί το Debian βρίσκεται στο πακέτο procps, γιατί η ίδια η εντολή χρησιμοποιεί τις πληροφορίες που προσφέρει ο ίδιος ο πυρήνας του Linux για τις διεργασίες σε ειδικά αρχεία στο σύστημα αρχείων /proc. Κάθε διεργασία απεικονίζεται στο /proc με ένα κατάλογο του οποίου το όνομα είναι το pid της διεργασίας. Για παράδειγμα:

# ls -l /proc/6755
total 0
-r--r--r--    1 feanor   users           0 Jul 13 23:41 cmdline
lrwxrwxrwx    1 feanor   users           0 Jul 13 23:41 cwd -> /home/feanor
-r--------    1 feanor   users           0 Jul 13 23:41 environ
lrwxrwxrwx    1 feanor   users           0 Jul 13 23:41 exe -> 
/usr/OpenOffice.org1.1/program/soffice.bin
dr-x------    2 feanor   users           0 Jul 13 23:41 fd
-r--r--r--    1 feanor   users           0 Jul 13 23:41 maps
-rw-------    1 feanor   users           0 Jul 13 23:41 mem
-r--r--r--    1 feanor   users           0 Jul 13 23:41 mounts
lrwxrwxrwx    1 feanor   users           0 Jul 13 23:41 root -> /
-r--r--r--    1 feanor   users           0 Jul 13 23:41 stat
-r--r--r--    1 feanor   users           0 Jul 13 23:41 statm
-r--r--r--    1 feanor   users           0 Jul 13 23:41 status

Τα αρχεία αυτά παρέχουν όλες τις απαραίτητες πληροφορίες για την διεργασία, όπως το όνομα της εντολής με το οποίο καλέστηκε (cmdline), τον τρέχοντα κατάλογο της διεργασίας (cwd), τις μεταβλητές περιβάλλοντος που υιοθέτησε η διεργασία (environ), τα ανοιχτά αρχεία που χειρίζεται (file descriptors στον κατάλογο fd), πληροφορίες κατανάλωσης μνήμης της διεργασίας (στα αρχεία stat, statm και status) ακόμη και τις διευθύνσεις των θέσεων μνήμης που καταναλώνει η διεργασία (maps). Οι πληροφορίες αυτές είναι χρήσιμες μόνο σε κάποιον πολύ έμπειρο διαχειριστή συστήματος, τις περισσότερες φορές αρκεί η χρήση της εντολής ps.

Η εντολή top

top
Η εντολή ps είναι πολύ χρήσιμη για μια στιγμιαία απεικόνιση του συστήματος. Η διαχείριση ενός συστήματος όμως, συνεπάγεται τη συνεχή παρακολούθηση της λειτουργίας του συστήματος, και η ps δεν είναι κατάλληλη. Για το σκοπό αυτό υπάρχει η εντολή top που εμφανίζει τις διεργασίες του συστήματος και άλλες πληροφορίες, όπως κατανάλωση μνήμης, φόρτο επεξεργαστή, συνολικό χρόνο λειτουργίας του συστήματος (uptime), και ανανεώνει τις πληροφορίες αυτές ανά τακτά διαστήματα (συνήθως ανά δευτερόλεπτο).

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

ksysguard2
Το KDE και το GNOME, προσφέρουν γραφικές εναλλακτικές της top, που μάλιστα προσφέρουν αρκετά περισσότερες λειτουργίες, στα προγράμματα ksysguard και gtop αντίστοιχα. Το ksysguard περιλαμβάνεται στην βασική διανομή του KDE (πακέτο kdebase) και μάλιστα εμφανίζει τη λίστα των διεργασιών με πάτημα των πλήκτρων [CTRL]-[ESC] οποιαδήποτε στιγμή, σε περιβάλλον KDE.

Τερματισμός εργασίας

Αρκετές φορές θα χρειαστεί να τερματίσουμε μια διεργασία, είτε γιατί δεν αποκρίνεται πια ή καταναλώνει όλους τους πόρους του συστήματος καθιστώντας αδύνατη τη λειτουργία του. Για το σκοπό αυτό χρησιμοποιούμε μια από τις εντολές kill και killall. Η kill δέχεται ως παράμετρο το process id της διεργασίας (ή των διεργασιών) θέλουμε να τερματίσουμε και το σήμα το οποίο θα στείλει στην διεργασία (βλ. επόμενη παράγραφο για περιγραφή των σημάτων). Αν δεν δώσουμε κάποιο σήμα, το προκαθορισμένο είναι το TERM (σήμα τερματισμού διεργασίας). Δέχεται μια επιλογή την -l, η οποία εμφανίζει λίστα των αποδεκτών σημάτων.

Η killall είναι μια βοηθητική εντολή που τερματίζει ή αποστέλει ένα συγκεκριμένο σήμα σε όλες τις διεργασίες με το δοσμένο όνομα. Από τις παραμέτρους που δέχεται, πιο χρήσιμες είναι οι -w, που περιμένει έως τον τερματισμό των διεργασιών, και η -i, που ζητάει επιβεβαίωση για κάθε διεργασία που πρόκειται να τερματίσει. Περιέχεται στο πακέτο psmisc.

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

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

# ps -ef|grep apache
root       822     1  0 Jul12 ?        00:00:00 /usr/sbin/apache
www-data  5589   822  0 Jul13 ?        00:00:00 /usr/sbin/apache
www-data  5590   822  0 Jul13 ?        00:00:00 /usr/sbin/apache
www-data  5591   822  0 Jul13 ?        00:00:00 /usr/sbin/apache
www-data  5592   822  0 Jul13 ?        00:00:00 /usr/sbin/apache
www-data  5593   822  0 Jul13 ?        00:00:00 /usr/sbin/apache
root     10894  1067  0 02:45 pts/4    00:00:00 grep apache
# kill  5589  5590  5591  5592  5593

Το ίδιο αποτέλεσμα μπορούμε να επιτύχουμε με την killall:

# killall /usr/sbin/apache

Προσοχή: Η χρήση της killall δε θα πρέπει να γίνεται χωρίς την απαραίτητη προσοχή. Το ότι προσφέρει ευκολία στον τερματισμό μιας διεργασίας δεν αντισταθμίζει το γεγονός ότι μπορείτε να τερματίσετε μια ολόκληρη ομάδα διεργασιών απλώς και μόνο επειδή έχουν το ίδιο όνομα. Παράδειγμα προς αποφυγή:

# killall bash

Για προφανείς λόγους...

Σήματα (Signals)

Τα σήματα αποτελούν τον κύριο τρόπο επικοινωνίας μεταξύ των διεργασιών. Οι διεργασίες που βρίσκονται σε κατάσταση αναμονής, έχουν ορίσει κάποιο σήμα το οποίο περιμένουν για να ξυπνήσουν και να το επεξεργαστούν. Αυτό το σήμα μπορεί να είναι ειδοποίηση για κάποιο αρχείο που έχει μεταβληθεί, νέα σύνδεση σε κάποιον υποδοχέα TCP/IP (socket) ή έχει μηδενιστεί κάποιο χρόνομετρο (timer). Πέρα από αυτά τα σήματα που είναι εξειδικευμένα για κάθε διεργασία, υπάρχουν και ορισμένα προκαθορισμένα σήματα που χρησιμοποιεί το σύστημα.

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

Σήμα
Κωδικός
Δράση
HUP 1 Τερματισμός διεργασίας (Hang Up), αν και συνήθως χρησιμοποιείται για επαναφόρτωση των ρυθμίσεων του προγράμματος. Μπορεί να γίνει ο χειρισμός από την ίδια την διεργασία.
INT 2 Διακοπή του προγράμματος (Interrupt). Το προγραμμα καλείται να τερματίσει και να ελευθερώσει τους πόρους. Αντιστοιχεί στο συνδυασμό πλήκτρων [CTRL]-C. Μπορεί να γίνει ο χειρισμός από την ίδια την διεργασία.
QUIT 3 Το πρόγραμμα καλείται να τερματίσει. Αν είναι ενεργοποιημένο, καταγράφεται το αποτύπωμα μνήμης της διεργασίας (core dump). Μπορεί να γίνει ο χειρισμός από την διεργασία.
TERM 15 Απότομος τερματισμός (Termination). Το πρόγραμμα ζητείται να ελευθερώσει όλους τους πόρους και να τερματίσει αμέσως. Ισοδύναμο με το συνδυασμό πλήκτρων [CTRL]-\. Μπορεί να γίνει ο χειρισμός από την ίδια την διεργασία.
KILL 9 Άμεσος Τερματισμός. Ο πυρήνας άμεσα ελευθερώνει όλους τους πόρους του προγράμματος και τερματίζει την εκτέλεσή του. Δε μπορεί να το χειριστεί η διεργασία.
STOP Παύση της διεργασίας. Σταματά προσωρινά η εκτέλεση της διεργασίας. Δε μπορεί να το χειριστεί η διεργασία.
CONT Συνέχιση της διεργασίας. Αν είχε παύσει η λειτουργία της, με το σήμα STOP συνεχίζει, διαφορετικά το αγνοεί. Δε μπορεί να το χειριστεί η διεργασία.

Παράδειγμα χρήσης σημάτων:

# killall -HUP inetd

Επανεκκινεί τον δαίμονα inetd, φορτώνοντας τις νέες ρυθμίσεις από το αρχείο /etc/inetd.conf.

# killall -KILL quake2

Τερματίζει άμεσα το παιχνίδι quake2. Καιρός για δουλειά!

Πόροι που ανήκουν σε διεργασίες

Μια αρκετά χρήσιμη δυνατότητα είναι η εύρεση των διεργασιών που χειρίζονται ένα συγκεκριμένο αρχείο ή έχουν δεσμεύσει ένα συγκεκριμένο υποδοχέα TCP ή UDP.
Αυτήν την πληροφορία μπορούμε να την αποκτήσουμε με την εντολή fuser (που βρίσκεται επίσης στο πακέτο psmisc). Η fuser χρησιμοποιεί την παρακάτω σύνταξη:

fuser [options] file...

Επιλογές
Λειτουργία
-k Τερματίζει τις διεργασίες που χρησιμοποιούν τα δοσμένα αρχεία ή τους υποδοχείς TCP/UDP. Εναλλακτικά, μπορεί να δεχτεί το σήμα που θα στείλει στις διεργασίες με το όνομα ή τον κωδικό του σήματος με μια παύλα, π.χ. -HUP.
-i Σε συνδυασμό με την -k, ζητάει επιβεβαίωση πρίν από τον τερματισμό.
-m Για χρήση με συστήματα αρχείων, εμφανίζει όλες τις διεργασίες που χρησιμοποιούν αρχεία οπουδήποτε μέσα στο δοσμένο κατάλογο.
-v Εμφανίζει αναλυτικό αποτέλεσμα.

$ fuser -vm /var/log/

                     USER        PID ACCESS COMMAND
/var/log/            root      11348 ....m  pppd
                     root      11552 ....m  apt-get
                     root     kernel mount  /var/tmp

Παρόμοια λειτουργία και με περισσότερες δυνατότητες προσφέρει η εντολή lsof (list open files), που παρέχεται με το ομώνυμο πακέτο.

Κωδικοί τερματισμού διεργασιών

Κάθε διεργασία μπορεί να καταλήξει σε τρεις διαφορετικές καταστάσεις: να τερματίσει κανονικά με επιτυχία, να αποτύχει αλλά ελεγχόμενα ή να τερματίσει ανώμαλα. Η κατάσταση εξόδου (exit status ή return code) της διεργασίας είναι ένας κωδικός αριθμός η τιμή του οποίου εξαρτάται από τον τρόπο τερματισμού της. Γενικά, κατάσταση εξόδου μηδέν σημαίνει ότι η διεργασία ολοκληρώθηκε κανονικά και δεν επέστρεψε κάποιο μήνυμα λάθους. Μη μηδενική κατάσταση εξόδου έχουμε όταν τερματίζει η εργασία είτε ελεγχόμενα είτε ανώμαλα.

Ελεγχόμενο τερματισμό έχουμε για παράδειγμα, όταν η διεργασία δεχθεί ένα σήμα διακοπής ([CTRL]-C) οπότε ελευθερώνει τους πόρους που χρησιμοποιεί, κλείνει τυχόν ανοιχτά αρχεία και τερματίζει. Ελεγχόμενο τερματισμό έχουμε επίσης όταν η διεργασία αδυνατεί να ολοκληρωθεί λόγω κάποιου προβλήματος , π.χ. δεν υπάρχει κάποιο αρχείο που προσπαθεί να προσπελάσει.

Ανώμαλο τερματισμό έχουμε όταν η διεργασία συναντήσει κάποιο πρόβλημα που δε μπορεί να αντιμετωπίσει, π.χ. παράνομη πρόσπελλαση μνήμης (illegal memory access). Τα προβλήματα αυτά συνήθως οφείλονται σε λανθασμένο προγραμματισμό (bug) και ως αποτέλεσμα έχουν τον άμεσο τερματισμό της διεργασίας από τον πυρήνα και – αν είναι ενεργοποιημένο το χαρακτηριστικό αυτό – την αποτύπωση της μνήμης της διεργασίας σε αρχείο (core dump).

Λογιστική διεργασιών (process accounting)

Για κάθε διεργασία που εκτελείται, ο πυρήνας του Linux κρατάει κάποιες πληροφορίες σε κάποια αρχεία που χρησιμοποιούνται για λογιστικούς σκοπούς (process accounting files). Με αυτόν τον τρόπο είναι δυνατή η εξαγωγή κάποιων στατιστικών στοιχείων. Πιο σημαντικό όμως, είναι το γεγονός ότι αυτή η λειτουργία μας δίνει τη δυνατότητα να γνωρίζουμε ορισμένες απαραίτητες πληροφορίες και ειδικά όταν έχουμε υποψίες για πιθανή παραβίαση της ασφάλειας του συστήματός μας. Ο πυρήνας διατηρεί αυτές τις πληροφορίες στα αρχεία /var/log/wtmp και /var/acct/pacct (σημειωτέον ότι ο πυρήνας θα πρέπει να έχει ενεργοποιημένη την επιλογή BSD process accounting.

Το Debian παρέχει τη δυνατότητα της επεξεργασίας αυτών των λογιστικών πληροφοριών με τα πακέτα acct και sac.

Στο πακέτο acct περιέχεται η εντολή lastcomm που εμφανίζει μια λίστα με όλες τις διεργασίες που έχουν εκτελεστεί έως τώρα (δηλαδή έως τη στιγμή της εκτέλεσης της lastcomm). Η λίστα αυτή είναι αρκετά μεγάλη, αλλά η lastcomm επιτρέπει να εφαρμόσετε κάποια φίλτρα, όπως εμφάνιση μόνο των διεργασιών κάποιου χρήστη (με την επιλογή --user), εμφάνιση μόνο των διεργασιών με συγκεκριμένο όνομα (με την --command) ή εμφάνιση των διεργασιών που εκτελέστηκαν σε συγκεκριμένο τερματικό tty (με την --tty). Για παράδειγμα, η παρακάτω εντολή μας εμφανίζει πότε ανανεώθηκε το ευρετήριο της εντολής locate:

# lastcomm --command updatedb
updatedb                root     ??         0.03 secs Mon Jul 14 06:25
updatedb           F    root     ??         0.00 secs Mon Jul 14 06:25
updatedb           F    root     ??         0.00 secs Mon Jul 14 06:25
updatedb           F    root     ??         0.00 secs Mon Jul 14 06:25
updatedb           F    root     ??         0.00 secs Mon Jul 14 06:25
updatedb           F    root     ??         0.00 secs Mon Jul 14 06:25

Το χαρακτηριστικό F για μερικές διεργασίες της λίστας σημαίνει ότι ήταν διακλαδωμένες διεργασίες της updatedb (forked) και ολοκληρώθηκαν την ίδια ώρα με την γονική τους updatedb. Σημειώνουμε ότι ο χρόνος που αναφέρεται είναι ο χρόνος της ολοκλήρωσης της διεργασίας και όχι της εκκίνησής της.
Η εντολή sa (summarize accounting) στο ίδιο πακέτο εμφανίζει μια περίληψη της προηγούμενης λίστας, και ίσως είναι πιο χρήσιμη. Η sa χρησιμοποιεί επιπλέον τα αρχεία /var/account/usracct για καταχώρηση των πληροφοριών ανά χρήστη και /var/account/savacct για καταχώρηση των μετρητών των διεργασιών.

Τέλος υπάρχουν και οι εντολές ac (στο πακέτο acct) και sac (στο ομώνυμο πακέτο) που παρέχουν πληροφορία για τις τελευταίες συνδέσεις κάποιου χρήστη. Η sac προσφέρει περισσότερες δυνατότητες από την ac (για την ακρίβεια έχει και πολλές από τις λειτουργίες της εντολής last, στην οποία θα αναφερθούμε στην επόμενη παράγραφο).
Για παράδειγμα αν θέλουμε να δούμε το συνολικό χρόνο σύνδεσης (σε ώρες) ανά χρήστη για τη σημερινή ημέρα, μπορούμε να δώσουμε:

# ac -pd
        root                                 0.00
        feanor                               6.77
Today   total        6.77

Το αποτέλεσμα είναι αρκετά λιτό. Κάτι αντίστοιχο μας επιστρέφει και η sac αλλά με περισσότερη πληροφορία:

# sac -pal
feanor                 6.84    2 logins      3.42 hrs/login
  Jul 14 16:15:52 - 21:55:31 port tty1                          5.66
  Jul 14 21:57:55 - 23:08:42 port tty1                          1.18
root                   4.01    2 logins      2.01 hrs/login
  Jul 14 12:12:38 - 16:13:10 port tty2                          4.01
  Jul 14 21:55:19 - 21:55:31 port tty2

Η sac είναι σαφώς πιο αναλυτική από την ac. Επιπλέον, μπορεί να μας δώσει και ωριαία χρήση του συστήματος:

# sac -ah
Total:        10.74 over 1 days.
Average:      10.74 / day,       2.69 / login
00-:       0.00
01-:       0.00
02-:       0.00
03-:       0.00
04-:       0.00
05-:       0.00
06-:       0.00
07-:       0.00
08-:       0.00
09-:       0.00
10-:       0.00
11-:       0.00
12-:       0.79 #################################################
13-:       1.00 ###############################################################
14-:       1.00 ###############################################################
15-:       1.00 ###############################################################
16-:       0.96 ############################################################
17-:       1.00 ###############################################################
18-:       1.00 ###############################################################
19-:       1.00 ###############################################################
20-:       1.00 ###############################################################
21-:       0.96 ############################################################
22-:       1.00 ###############################################################
23-:       0.03 ##

Στο σημείο αυτό πρέπει να σημειώσουμε ότι σε μία τυπική εγκατάσταση του Debian τα αρχεία /var/log/wtmp, /var/account/usracct και /var/account/savacct δεν δημιουργούνται για λόγους χώρου. Αυτά τα αρχεία μεγαλώνουν σε μέγεθος με πολύ μεγάλους ρυθμούς και χωρίς την απαραίτητη προσοχή κινδυνεύουν να εξαντλήσουν τον ελεύθερο διαθέσιμο χώρο στο σύστημα αρχείων που βρίσκονται (δηλαδή αυτό που φιλοξενεί τον κατάλογο /var). Η δημιουργία του αρχείου μπορεί να γίνει με την εντολή touch.

Χρήσιμα πακέτα: acct, psmisc, atop, ncps, slay, gtop, lsof, sac.

0
Your rating: None