Καλησπέρα σε όλους. Μιας και τον τελευταιο καιρό με εχει πιάσει μια μανία με τις διεργασίες , είπα να δοκιμάσω να ανεβάσω εναν οδηγό περισσότερο για εκμάθηση και για πρακτική επίσης. Θέλω να πω πως δεν θα φτάσουμε σε βάθος μεγάλο χρονο-προγραμματισμού παρα μπορούμε να επισημάνουμε 2-3 βασικά πράγματα σχετιζόμενα με τις διεργασίες για κάθε νεοεισερχόμενο χρήστη στον κόσμο του Λίνουξ.
ΠΕΡΙΕΧΟΜΕΝΑ
1. Ορισμός Διεργασίας
2. Διεργασίες
2.1 Διεργασίες ως προς το Λειτουργικό Σύστημα & το HardWare
2.2 H init( )
3. Πρακτική - Εντολές στο Τερματικό
4. Απλός & Βασικός Χρονοπρογραμματισμός Διεργασιών
5. ΕΠΙΛΟΓΟΣ
1.Τις διεργασίες μπορούμε να τις φανταστούμε σαν προγράμματα (που όντως είναι) και εκτελούνται στο συστημά μας. Η εκτέλεση μιας εφαρμογής μπορεί να είναι ενα τυπικό παράδειγμα μιάς διεργασίας. Επίσης διεργασίες συναντάμε και στους δαίμονες που τρέχουν στους διακομιστές Στην ουσία και οι δαίμονες ειναι διεργασίες οι οποίες εκτελούνται συνεχώς στο παρασκήνιο μέχρι να πρόγραμμα πελάτη (client) να ζητήσει απο τον σέρβερ στον οποίο τρέχει η διεργασία σύνδεση (τυπικό παράδειγμα -> ftp clients). Στα συστήματα του UNIX & του Linux κάθε προγραμμα που εκτελείται ειναι μια διεργασία , επίσης περισσότεροι απο ένας χρήστες μπορούν να τρέχουν προγράμματα την ίδια χρονική στιγμή και έτσι περισσότερες απο μια διεργασίες μπορούν να εκτελούνται την ίδια χρονική στιγμή. Για τον λόγο αυτό τα συστήματα του UNIX / Linux χαρακτηρίζονται ως Multiuser-MUltitasking.
2.
2.1 Πρίν προχωρήσουμε στην εξέταση των Διεργασιών ως προς το λειτουργικό σύστημα αλλα και το Hardware (φυσικά ούτε εδώ θα διεισδύσουμε αρκετά) πάμε να δούμε τι ακριβώς συμβαίνει με τα σήματα στις διεργασίες. Η διαδικασία έχει ως εξής ->
Οι διεργασίες περιμένουν για σήματα. Καθένα απο τα οποία ωθεί τις διεργασίες να κάνουν μια συγκεκριμένη λειτουργία. Τα σήματα αναπαρίστανται με αριθμούς και ονόματα , θα παραθέσω μονο μερικά απο αυτά τα σήματα καθώς ο σκοπός του οδηγού μου είναι να καλυφθούν οι έννοιες με σοβαρότητα και αξιοπιστία χωρίς αυτο να σημαίνει μεγάλη ανάλωση σε κατεβατό απο θεωρίες.
- Κώδικας: Επιλογή όλων
ΑΡΙΘΜΟΣ -> 1 ΟΝΟΜΑ -> SIGHUP ΣΗΜΑΣΙΑ -> Hang UP (Κλεισιμο διεργασιας)
ΑΡΙΘΜΟΣ -> 9 ΟΝΟΜΑ -> SIGKILL ΣΗΜΑΣΙΑ -> Οριστικος τερματισμος που δεν μπορεί να αγνοηθεί
Υπάρχουν πανω απο 30 διαφορετικά σήματα για τα οποία γνωρίζει το Λινουξ αλλα εδώ απεικονίζονται μονο 2 απο τα πιο χρήσιμα. Το SIGHUP ειναι εκείνο το σήμα που στέλνεται σε κάθε διεργασία που εκτελείται ωστε να την ωθήσει να κλείσει πριν αποσυνδεθούμε απο το σύστημα. Το SIGKILL απο την άλλη ωθεί τις διεργασίες να τερματίσουν αμέσως χωρίς ουτε μια ευκαιρία! Ειναι αρκετά πιο απότομο σήμα απο τα υπόλοιπα.
Οι διεργασίες με το λειτουργικό Σύστημα έχουν γόρδια συσχέτιση!!!! Καταρχήν ο πυρήνας του λειτουργικού μας συστήματος ειναι υπεύθυνος για την προώθηση των σημάτων στις διεργασίες για τα οποία σύντομη αναφορά έγινε πιο πάνω. Ειδικότερα ΧΡΟΝΟΔΡΟΜΟΛΟΓΗΤΗΣ είναι εκείνο το τμήμα του πυρήνα που παίρνει αποφάσεις σχετικά με την ανάθεση της CPU (Central Process Unit) στις διάφορες διεργασίες.
Αφού φανταστήκαμε την διεργασία σαν ένα πρόγραμμα που εκτελείται στο συστημά μας... για να αποφύγουμε την σύγχυση και να καταλάβουμε σε βάθος τι ακριβώς συμβαινει... τελικά η διεργασία είναι είναι ενα στιγμιότυπο του προγράμματος στην RAM που είπαμε πιο πάνω το οποίο υπάρχει στον σκληρό δίσκο εγκατεστημένο (μόνιμα). Ο Λόγος έγκειται στο γεγονός οτι θα πρέπει να φανταστούμε την μνήμη ενος ηλεκτρονικού υπολογιστή με την μορφή μιας πυραμίδας. Κατω κατω στην πυραμίδα βρίσκονται τα μέρη με τον μεγαλύτερο-χειρότερο χρόνο προσπέλασης αλλά την μεγαλύτερη χωρητικότητα μνήμης (σκληροί δίσκοι , μαγνητικές ταινίες κτλπ) ενώ πάνω πάνω στην πυραμίδα βρίσκονται τα μέρη με τους καλύτερους χρόνους προσπέλασης αλλα με την μικρότερη χωρητικότητα σε μνήμη και την πιο ακριβή. (Μνήμες ΡΑΜ - Κρυφές μνήμες)
Έτσι λοιπον για να υπάρχει καλύτερος χρόνος προσπέλασης ενός προγράμματος και έτσι να μην πέφτει η απόδοση του συστήματος τα προγράμματα μόλις φορτώσει ο υπολογιστης τις πληροφοριες απο τον σκληρό κτλπ περνάνε στην μνήμη RAM ώς στιγμιότυπα τα οποία και θα διαγραφούν μολις διακοπεί η παροχή ρεύματος. Φυσικά ολα αυτά σχετικά με την RAM , διοτι μεγάλο ρόλο παίζει και ο επεξεργαστής μιας και οι διεργασίες ανταγωνίζοντε τον χρόνο του , κάτι τετοιο μπορει να δημιουργήσει προβλήματα στην απόδοση μιας και ορισμένες διεργασίες μπορει να έχουν περισσότερες απαιτήσεις σε επεξεργαστική ισχύ απο κάποιες αλλες. Για τον λόγο αυτό έχει ορισθεί ένα σύστημα προτεραιοτήτων στο οποίο διεργασίες με υψηλότερη προτεραιότητα εκτελούνται πρώτες και με την σειρά ενω όλες οι υπόλοιπες παίρνουν τον εναπομείνονται χρόνο της CPU.
2.2 Η διεργασία init ( ) είναι η σημαντικότερη διεργασία στο σύστημα μας και παίρνει πάντοτε 1 σαν PID
Για να αντιληφθούμε την σημασία της μπορούμε να μεταφερθούμε στον κατάλογο της.
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ cd /etc/init.d
kostas@kostas-SSL:/etc/init.d$ ls
acpid hwclock rsyslog
acpi-support hwclock-save rwhod
alsa-mixer-save irqbalance saned
anacron kerneloops screen-cleanup
apache2 killprocs sendsigs
apparmor lm-sensors single
apport module-init-tools skeleton
atd mysql smartmontools
avahi-daemon networking snmpd
binfmt-support network-interface speech-dispatcher
bluetooth network-interface-security stop-bootlogd
bootlogd ondemand stop-bootlogd-single
brltty pcmciautils sudo
console-setup plymouth udev
cron plymouth-log udev-finish
cups plymouth-splash udevmonitor
dbus plymouth-stop udevtrigger
dmesg pppd-dns ufw
dns-clean procps umountfs
failsafe-x pulseaudio umountnfs.sh
fancontrol rc umountroot
gdm rc.local unattended-upgrades
grub-common rcS urandom
halt README x11-common
hddtemp reboot
hostname rsync
Ας υποθέσουμε οτι το ποντίκι μας ξαφνικά χάλασε (κακό σενάριο) !!!! Πριν προλάβουμε να τερματίσουμε κάποια εφαρμογή που θα θέλαμε με γραφικό τρόπο.
Μπορώ να τερματίσω-σταματήσω-κλείσω οπως θέλετε πειτε το (αν ο κερσορας συνεχιζει να αναβοσβηνει στο τερματικο)!!! οποιαδήποτε εφαρμογή η οποία υπάρχει στον κατάλογο της init
δίνοντας την παρακάτω εντολή
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ sudo /etc/init.d/bluetooth stop
και αντιστοίχως να την ξανα ενεργοποιήσω
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ sudo /etc/init.d/bluetooth start
3.Στο σημείο αυτό ήρθε η στιγμή να δούμε μερικές εντολές στο τερματικό που σχετίζονται με τις διεργασίες
Με την εντολή ps μπορούμε να δούμε αρκετά πραγματάκια.
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ ps
PID TTY TIME CMD
1922 pts/0 00:00:00 bash
2020 pts/0 00:00:00 ps
Το 1ο βήμα είναι η εντολή ps χωρίς σημάνσεις ή ορίσματα. Το PID είναι ένας αριθμός αναγνωριστικός για κάθε διεργασία ο οποίος αποτελεί την ταυτοτητά της , κάθε στιγμή αυτη η ταυτότητα ειναι μοναδική αλλα μπορούμε να την δούμε να επαναλαμβάνεται χωρις να χρειαζεται να παραξενευτούμε μιας και το εύρος των αριθμών που δίνει το λειτουργικό ειναι περιορισμένος( απο 0 εως 3300 περίπου). Η στηλη TTY μου δείχνει την συσκευή του τερματικού μου ενω το CMD αναφέρεται στην εντολή που εκτελώ καθε φορα.
Για να δούμε τις διεργασίες που σχετίζονται με το τερματικό αρκεί να χρησιμοποιήσουμε την σήμανση -a στην ps
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ ps -a
PID TTY TIME CMD
1683 pts/0 00:00:00 ps
Αρκετά καθαρό το τερματικό μου αυτή τη στιγμή , η μόνη διεργασία που εκτελείται σε αυτό ειναι αυτη της εντολής ps.
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ ps -u
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
kostas 1659 0.1 0.2 22544 3976 pts/0 Ss 01:12 0:00 bash
kostas 1684 0.0 0.0 17768 1200 pts/0 R+ 01:15 0:00 ps -u
Μπορούμε να συνδυάσουμε όλες τις παραπάνω σημάνσεις για την ps σε μια ακριβώς εντολή και να δούμε οτιδήποτε συμβαίνει στο συστημά μας.
- Κώδικας: Επιλογή όλων
ps -aux
Ωστόσο η εντολή ps -aux είναι ισοδύναμη και με την ps -ef αλλα και με την ps -A
- Κώδικας: Επιλογή όλων
ps -A
αυτό μπορούμε να το διαπιστώσουμε εύκολα αν βάλουμε στο "παιχνίδι" το προγραμματάκι wc μαζι με την σήμανση -l που εμφανίζει τις γραμμες της εξόδου μέσω μιας διοχεύτευσης
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ ps -aux | wc -l
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
171
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ ps -A | wc -l
171
κάτι το οποίο φαίνεται και μέσω του προγράμματος top (Το οποίο σε αυτή την περίπτωση έχει διάρκεια συνεχή και ανανέωνεται ανα δευτερόλεπτο σε αντίθεση με την ps )
- Κώδικας: Επιλογή όλων
Tasks: 169 total, 2 running, 167 sleeping, 0 stopped, 0 zombie
Cpu(s): 4.8%us, 1.3%sy, 0.0%ni, 93.2%id, 0.6%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1851536k total, 1768548k used, 82988k free, 876056k buffers
Swap: 26491900k total, 0k used, 26491900k free, 349424k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1019 root 20 0 163m 34m 11m S 4 1.9 3:21.80 Xorg
1593 kostas 20 0 798m 180m 32m S 4 10.0 5:21.73 firefox-bin
1712 kostas 20 0 134m 47m 15m R 2 2.6 7:55.06 npviewer.bin
1 root 20 0 23856 1980 1272 S 0 0.1 0:00.98 init
Μπορώ να χρησιμοποιήσω την εντολή ps με την σήμανση -ef που ειπώθηκε πιο πάνω για να δώ όλες τις διεργασίες του συστήματος και μέσω μιας σωλήνωσης να βρώ για παράδειγμα το PID του amsn μου ή του xchat κτλπ....
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ ps -ef |grep amsn
kostas 2049 2031 22 15:28 pts/3 00:00:05 wish8.5 /usr/bin/amsn
kostas 2055 1652 0 15:29 pts/0 00:00:00 grep --color=auto amsn
Έστω τωρα οτι σε αυτό το σημείο θα ήθελα να κλείσω την εφαρμογή firefox-bin που βλέπω παραπάνω το PID της μέσω της top ή οποιαδήποτε εφαρμογή κολλάει !!!
- Κώδικας: Επιλογή όλων
kill 1593
μπορώ αντί της kill PID να δώσω την kill με το σήμα SIGHUP για το οποίο έγινε λόγος πιο πάνω
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ kill -SIGHUP 1593
Μπορούμε να δούμε όλα τα σήματα που υπάρχουν για την εντολή kill μεσω της
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
Πέρα απο την εντολή kill υπάρχει και μια παραλλαγή αυτής η εντολή killall για να κάνουμε μια σωστή σύγκριση ανάμεσα στην kill και την killall θα δώσουμε ένα παράδειγμα . Εγω προσωπικά έχω 3 λογαριασμούς του messenger (AMSN ) θα ενεργοποιήσω και τους 2 απο 2 διαφορετικα τερματικα... κρατώντας ένα ακομη τερματικό ανοικτό το οποίο δεν θα απασχολείται απο τις 2 αυτές ξεχωριστές διεργασίες του messenger μου! Απο το 3ο τερματικό λοιπόν δίνω την εντολή
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ ps -a
PID TTY TIME CMD
1820 pts/1 00:00:06 wish8.5
1844 pts/2 00:00:07 wish8.5
1849 pts/2 00:00:00 aplay <defunct>
1898 pts/0 00:00:00 ps
Αν επιλέξω να χρησιμοποιήσω την σκέτη kill θα χρειαστεί να χρησιμοποιήσω το αντιστοιχο PID καθεμιάς εκ των διεργασιών των 2 amsn για να τερματισω ένα απο τα 2 ομως.... (μπορω να τερματίσω και τα 2 φυσικα αλλα με 2 PID διπλα στην kill για την καθεμια ξεχωριστά). Στο σημείο αυτό αν εγώ θέλω να τερματίσω και τις 2 διεργασίες ταυτόχρονα μεσω της kill δεν μπορώ να το πετύχω διοτι
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ kill wish8.5
bash: kill: wish8.5: arguments must be process or job IDs
Θα χρησιμοποιήσω την killall <name_programm> που ειναι και η βασική της σύνταξη για να καταλάβω τι κάνει
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ killall wish8.5
Πράγματι!!!! Ηταν αυτό που ήθελα!!! Και οι 2 εφαρμογές του amsn που έτρεχαν απο 2 διαφορετικά τερματικά έκλεισαν!!!
ΣΥΜΠΕΡΑΣΜΑ -> Η killall σκοτώνει όλες τις διεργασίες που τρέχουν και έχουν ένα συγκεκριμένο όνομα!!!!
ΠΡΟΣΟΧΗ!!! Η χρήση της killall θα πρέπει να γίνεται με προσοχή. Το οτι παρέχει κάποιον βαθμό ευκολίας στον τερματισμό μιας ομάδας διεργασιών με το ίδιο όνομα δεν ειναι πάντα τόσο αθώο!
Η εντολή ps έχει περισσότερες σημάνσεις και απο την ls!!!!! Οπότε αν θέλουμε να δούμε όλες τις σημάνσεις της μπορούμε να δώσουμε
- Κώδικας: Επιλογή όλων
man ps
4. Βασικός Χρονοπρογραμματισμός Διεργασιών
Κάποιες φορές χρειάζεται να έχουμε οι ίδιοι τον πλήρη έλεγχο των διεργασιών (αν όχι των βασικών του συστήματος για το οποίο χρειάζεται αρκετή εμπειρία και χρόνια ενασχόλησης με το λίνουξ) σίγουρα των απλών προγραμμάτων που εκτελούμε. Ένας σημαντικός λόγος προς την κατεύθυνση αυτή είναι οτι η εκτέλεση ενός προγράμματος απο το τερματικό μπορεί να χρειαστεί αρκετή ώρα ωστε να κάτσουμε να την περιμένουμε μιας και πρέπει να ασχοληθούμε με κάτι άλλο όση ώρα αυτή εκτελείται στο παρασκήνιο ή απλα αναμένει απο το σημείο που την αφήσαμε όπως πραγματικά μπορεί να γίνει με τους διάσημους επεξεργαστές κειμένων vi . Για να θέσουμε τον vi στο παρασκήνιο αρκεί να δώσουμε το όνομα του και δίπλα τον ειδικό χαρακτήρα &. Αυτή η τακτική μπορει να δουλέψει φυσικά με όλα τα προγράμματα
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ vi &
[1] 2564
kostas@kostas-SSL:~$ jobs
[1]+ Stopped vi
kostas@kostas-SSL:~$
Θέσαμε τον vi στο παρασκήνιο και στην συνέχεια εκτελέσαμε την εντολη jobs για να δούμε την ουρά με τις διεργασίες που υπάρχουν στο παρασκήνιο.... στο σημείο αυτο υπάρχουν 2 βασικά σημεία που πρέπει να επισημάνουμε. Καταρχήν ο αριθμος [1] δεν σχετίζεται σε καμία περίπτωση με τους μονοψήφιους κωδικούς οι οποίοι δίνονται σε βασικές διεργασίες του συστήματος οπως ειναι η init αλλα για λόγους ευκολίας η εντολή μας λέει πως στην ουρά η 1η διεργασια που περιμένει ειναι αυτη με PID 2564 δηλαδή του vi. Και το 2ο σημείο είναι το stopped , αυτο σημαίνει οτι απαιτείται είσοδος απο τον χρήστη.
Για να φέρω αυτη την διεργασία στο προσκήνιο αρκεί να εκτελέσω την
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ fg
- Κώδικας: Επιλογή όλων
~
~
~
~ VIM - Vi IMproved
~
~ version 7.2.330
~ by Bram Moolenaar et al.
~ Vim is open source and freely distributable
~
Για να τερματίσω την διεργασία στο παρασκήνιο μπορώ να δώσω την γνωστή εντολη kill ακολουθομενη με % και τον αριθμό που βρίσκεται μέσα στις αγκύλες και δείχνει την σειρά της στην ουρά.
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ kill %1
Στο σημείο αυτό μπορώ επίσης να χρονοπρογραμματίσω διεργασίες να εκτελεστούν την ημέρα και ώρα που θέλω εγώ !!! Αυτό μπορει να γίνει με την εντολή at
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ at 2.00
warning: commands will be executed using /bin/sh
at> touch file
at> <EOT>
job 5 at Fri Mar 25 02:00:00 2011
kostas@kostas-SSL:~$ atq
5 Fri Mar 25 02:00:00 2011 a kostas
Προγραμμάτισα λοιπόν για απόψε στις 2 τα μεσάνυχτα ο πυρήνας να καλέσει το πρόγραμμα touch δημιουργώντας ενα αρχείο με όνομα file στην συνέχεια πάτησα COntrol + D για να βγώ απο το πρόγραμμα το οποίο μου επέστρεψε την εργασία που πρόκειται να υλοποιήσει. Στην συνέχεια με την atq είδα την ουρά με τις προγραμματισμένες διεργασιές και τέλος μπορώ να διαγράψω την προγραμματισμένη διεργασία με την εντολη atrm + τον αριθμό 5 που δίνεται παραπάνω
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ atrm 5
kostas@kostas-SSL:~$ atq
kostas@kostas-SSL:~$
Μπορούμε να χρησιμοποιήσουμε την εντολή at κάνοντας την ακόμη πιο ακριβή (ως προς την ημερομηνία) και δινοντας της και άλλες εργασίες προς εκτέλεση.
Για παράδειγμα
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ at 1200 april 5
warning: commands will be executed using /bin/sh
at> touch hello
at> <EOT>
job 7 at Tue Apr 5 12:00:00 2011
Δημιουργία του αρχείου hello στις 5 Απριλίου του 2011 ( Εφοσον δεν δώσαμε ακριβές έτος το πρόγραμμα θα χρησιμοποιήσει το τρέχον έτος προκαθορισμένα)
Φυσικά στην προτροπή at> μπορούμε να δώσουμε οποιαδήποτε εργασία θέλουμε να γίνει.... απο την δημιουργία ενός απλού αρχείου μέχρι και την μεταγλώττιση ενός προγράμματος με την
- Κώδικας: Επιλογή όλων
cc -o crc crc.c
Επίσης μπορούμε και απευθείας να δώσουμε μια εργασία με μια εντολή στο πρόγραμμα at χωρίς να μπούμε σε προτροπές του.
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:~$ echo "hello world" > new.txt | at 13.35
warning: commands will be executed using /bin/sh
job 6 at Fri Mar 25 13:35:00 2011
Μέσα σε ένα αρχείο κειμένου με όνομα new θέλω να περάσω την συμβολοσειρά "hello world" χρησιμοποιώντας την echo και στην συνέχεια όλο αυτο να το περάσω σαν εργασία στην at.
EDIT: Για πιο έμπειρους διαχειριστές υπάρχουν και περισσότερες πληροφορίες που μπορούν να αντλήσουν για μια διεργασία.
απο το τερματικό δίνουμε την εντολή για να μπούμε στο εικονικό σύστημα αρχείων /proc οπου εκει έχουμε τα PID της κάθε διεργασίας αριθμημένα σαν καταλόγους. Η ονομασία καθε καταλογου αντιστοιχεί με το PID της αντιστοιχης διεργασίας.
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:/$ cd proc
kostas@kostas-SSL:/proc$ ls
1 1317 1633 1792 351 57 799 dri partitions
10 1323 1634 18 36 6 8 driver sched_debug
1026 14 1638 1800 37 606 80 execdomains schedstat
1029 1416 1640 19 38 62 800 fb scsi
επειδή η έξοδος ειναι λίγο μεγάλη θα περιοριστούμε.
στην συνέχεια άν μπούμε στον κατάλογο της init της αρχικής διεργασίας(δίνοντας το PID της δηλαδη το 1) και πατέρα ολων των υπολοίπων θα δούμε επιμέρους αρχεία που έχουν πληροφορίες σχετικά με την καταστασή της. Και θα ανοίξουμε και 2 στο πιο κατω τμημα... Το status και coredump_filter
- Κώδικας: Επιλογή όλων
kostas@kostas-SSL:/proc$ cd 1
kostas@kostas-SSL:/proc/1$ ls
ls: αδυναμία ανάγνωσης συμβολικού συνδέσμου cwd: Άρνηση πρόσβασης
ls: αδυναμία ανάγνωσης συμβολικού συνδέσμου root: Άρνηση πρόσβασης
ls: αδυναμία ανάγνωσης συμβολικού συνδέσμου exe: Άρνηση πρόσβασης
attr cpuset latency mountstats root statm
auxv cwd limits net sched status
cgroup environ loginuid numa_maps schedstat syscall
clear_refs exe maps oom_adj sessionid task
cmdline fd mem oom_score smaps wchan
comm fdinfo mountinfo pagemap stack
coredump_filter io mounts personality stat
kostas@kostas-SSL:/proc/1$ cat coredump_filter
00000023
kostas@kostas-SSL:/proc/1$ cat status
Name: init
State: S (sleeping)
Tgid: 1
Pid: 1
PPid: 0
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64
Groups:
VmPeak: 23880 kB
VmSize: 23868 kB
VmLck: 0 kB
VmHWM: 2032 kB
VmRSS: 1760 kB
VmData: 708 kB
VmStk: 136 kB
VmExe: 116 kB
VmLib: 2348 kB
VmPTE: 64 kB
VmSwap: 272 kB
Threads: 1
επειδή παλι η έξοδος ηταν μεγάλη το περιόρισα.
Για το αρχειο coredump_filter οπου υπάρχει μεγάλη συζήτηση απο πισω μπορει καποιος να διαβασει
και στους παρακάτω σύνδεσμους
http://www.kernel.org/doc/man-pages/onl ... ore.5.html
http://en.wikipedia.org/wiki/Memory-mapped_I/O
με 2 λογια προκειται για την αποτύπωση της μνήμης της διεργασίας σε ένα αρχείο ("χωματερής πυρήνα")
υστερα απο ανώμαλο τερματισμό πχ παράνομη προσπέλαση μνήμης.
5. ΕΠΙΛΟΓΟΣ "Οι 4 ημέρες της ζωής ενός Διαχειριστή του Λίνουξ" (Ένας Παραλληλισμός)
Ο Bob είναι ένας άνθρωπος ο οποίος ζεί στην Ν. Υορκη και ασχολείται αρκετά χρόνια με τα λειτουργικά συστήματα των UNIX / Linux.
ΗΜΕΡΑ 1η : Ξαφνικά ένα πρωί κτύπησε το τηλεφωνό του απο έναν φίλο του ο οποίος είχε δικό του ταξιδιωτικό γραφείο , ο φίλος του φαινόταν ταραγμένος και αρκετά ανήσυχος καθώς ο διακομιστής ο οποίος φιλοξενούσε το σάιτ της επιχειρησής του φαινόταν να μήν πηγαίνει και τόσο καλά τώρα τελευταία. Τι συμβαίνει αναρωτήθηκε ο Bob στον φίλο του. Ο φίλος του , του εξήγησε πως ο υπολογιστής της επιχειρησής του κολλάει και ειναι πραγματικά αργός! Ο BOb ρώτησε τον φίλο του τι λειτουργικό σύστημα τρέχει ο συγκεκριμένος υπολογιστής ... Linux ήταν η απάντηση με διανομή UBuntu!!! Κοίταξε να δεις του αποκρίθηκε ο Bob εφόσον απέκλεισε όλα τα ενδεχόμενα ο υπολογιστής να έχει πρόβλημα στο μηχανικό του τμήμα.... Κάποιες διεργασίες σου κάνουν την ζημιά οι οποίες τρέχουν και δημιουργούν φόρτο στον επεξεργαστή . ΤΙ ειναι οι διεργασίες ρωτήθηκε απο τον φίλο του... ΟΙ διεργασίες ειναι προγράμματα τα οποία τρέχουν στο συστημά σου του αποκρίθηκε ο BOb , κάθε διεργασία μπορεί να ξεκινήσει μια άλλη και να υπάρχει μια γονική σχέση ανάμεσα στις 2. Γονικές και θυγατρικές διεργασίες αντίστοιχα η init είναι ο πατέρας όλων των διεργασιών του συστήματος αν η θυγατρική ειναι ίδια με την γονική τότε έχουμε διακλάδωση διεργασιών (fork) μπορείς να δείς την ιεραρχία των διεργασιών με την
- Κώδικας: Επιλογή όλων
pstree
ΗΜΕΡΑ 2η : Ο Bob βρισκόταν ήδη απο το μαγαζί του φίλου του και του εξηγούσε με ποιό τρόπο τα προγράμματα-διεργασίες τρέχουν σαν στιγμιότυπα στην RΑΜ! Καθως και τον τρόπο με τον οποίο ο επεξεργαστής στο λίνουξ διαχειρίζεται τις διεργασίες ως προς την προτεραιότητα τους. Ο Bob ηθελε μεσω καποιας εντολής να δεί όλες τις διεργασίες που σχετιζόντουσαν με τα συνδεδεμένα στο σύστημα τερματικά για τον διακομιστη οπως και επισης ολες τις ενδιαφέρουσες διεργασίες οι οποιες δεν απαιτούνται απο το λειτουργικό συστημα... για αυτο δοκιμασε την
- Κώδικας: Επιλογή όλων
ps -ag
ΗΜΕΡΑ 3η : O Bob ανακαλυψε αρκετές διεργασίες οι οποίες είχαν τελείωσει μεν αλλα για καποιο λόγο δεν είχαν ελευθερώσει τους πόρους τους.Σε ένα συστημα το οποιο κάνει επανεκκινησεις... αυτο δεν θα ηταν προβλημα σκεφτηκε ο Bob διοτι οι διεργασιες αυτες οι οποίες ονομάζονται ZOMBIE θα είχαν τερματίσει έτσι και αλλιώς αλλα ο σέρβερ του φίλου του έπρεπε να ηταν μονίμως σε λειτουργία !!! Θα χρειαζόταν να χρησιμοποιήσει την εντολη
- Κώδικας: Επιλογή όλων
kill PID_ZOMBIE
- Κώδικας: Επιλογή όλων
killall name_programm
ΗΜΕΡΑ 4η : O Bob χρησιμοποιήσε την εντολη
- Κώδικας: Επιλογή όλων
at
Ο οδηγός αυτός αποτελεί μια προσωπική έμπνευση όσο αναφορα τον επιλογό του μιας και προσπάθησα να κάνω έναν παραλληλισμό . Ενδέχεται να υπάρχουν κάποια λαθάκια.... Να μου τα επισημάνετε οπωςδηποτε για να τα αλλάξω και να τον ανανεώσω! ΕΛπίζω να τον βρείτε χρήσιμο.....
Η εργασία υπάγεται στην άδεια Creative Commons Αναφορά-Μη εμπορική χρήση-Παρόμοια διανομή 3.0 Ελλάδα