Διαχείριση διεργασιών
Περί διεργασιών
Έχουμε ήδη χρησιμοποιήσει τον όρο “διεργασία” αρκετές φορές, χωρίς να τον τεκμηριώσουμε ικανοποιητικά. Τι ακριβώς είναι οι διεργασίες και πως τις αντιλαμβάνεται το λειτουργικό συστημα και ο επεξεργαστής;
Στα παλαιότερα λειτουργικά συστήματα (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 | Ταξινομεί τη λίστα με βάση τα δεδομένα στοιχεία-κλειδιά. Δέχεται δύο μορφές: μία σύντομη και μία πλήρη. Μερικά από τα κλειδιά ταξινόμησης είναι (σε παρένθεση η σύντομη μορφή):
|
Ακολουθούν μερικά παραδείγματα της χρήσης της εντολής.
$ 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.
Active forum topics
- Wake up from suspend mode failed
- Οργάνωση στις μεταφράσεις των ελληνικών στο Debian.
- απορια σχετικα με nvidia440
- πρόβλημα εγκατάστασης nvidia driver GTS250.
- kernel 2.6.38 για squeeze
- Gnome3
- 2 μήνες σπασμένο το upgrade σε unstable [SOLVED]
- Οι χρήστες του Internet Explorer είναι χαζοί;
- Debian Lenny + Nvidia drivers
- εγκατασταση usb cosmote
New forum topics
Νέοι χρήστες
- kountp
- Adonthegreat
- giorgos_m
- prodromos
- airmaik
Οι πιο πρόσφατες καταχωρίσεις blog.
- Fosscomm 2012
- armhf officially into Debian!
- back from UDS/Linaro Connect...
- FTF is over, Linaro Interview
- straight from FTF 2011, San Antonio...
- Όσο μεγαλώνεις μαθαίνεις...
- Emdebian 2011 Sprint report, Genesi Europe store goes online...
- Θεσσαλονίκη - open source ERP workshop
- Χρήσιμο URL για Flash Cards και Linux filesystems
- Cambridge, UK, ARM HQ for Emdebian 2011 Sprint