13. Procesbeheer
Een Linux-systeem bestaat in feite uit drie onderdelen:
- De kernel
- Bestanden
- Processen
Elk programma, dat draait op een Linux-computer is een proces. En aangezien
Linux een multi-tasking systeem is, draaien er meestal meerdere processen
tegelijkertijd. Dat laatste is niet helemaal waar: het lijkt of de
verschillende processen tegelijkertijd draaien. De processor van de computer
kan echter maar één proces tegelijk aan. Door nu heel snel van
proces naar proces om te schakelen, lijkt het of die processen tegelijk
draaien. De grote regelaar in dit gebeuren is natuurlijk de Linux kernel.
Processen bekijken
Je kunt zien welke processen er allemaal op je computer draaien en wel met de
opdracht ps. Je krijgt een lijst te zien met processen, die op dat
moment draaien op de "terminal" waar je aan werkt:
[jan@gnodde linux]$ ps
PID TTY TIME CMD
416 pts/0 00:00:00 /bin/bash
430 pts/0 00:00:00 ps
ps kent echter vele opties. Kijk maar eens in de manpages (man
ps). Een veel gebruikte vorm is:
[jan@gnodde linux]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 1288 484 ? S 14:14 0:04 init
root 2 0.0 0.0 0 0 ? SW 14:14 0:00 [keventd]
root 3 0.0 0.0 0 0 ? SW 14:14 0:00 [kapmd]
root 4 0.0 0.0 0 0 ? SWN 14:14 0.00 [ksoftirqd_CPU0]
{knip}
jan 2301 2.7 5.6 23156 12628 ? S 17:49 0:00 kdeinit: konsole
jan 2303 0.8 0.7 2792 1676 pts/1 S 17:49 0:00 /bin/bash
jan 2332 0.8 1.0 7916 2372 ? S 17:49 0:00 /usr/bin/medusa-i
jan 2337 0.0 0.3 2612 796 pts/1 R 17:49 0:00 ps aux
Je krijgt een veel langere rij met processen te zien. Dit geeft je indruk van
wat er aan werk (veelal op de achtergrond) wordt verricht door Linux.
De lijst laat heel wat informatie zien. Laten we eens kijken naar de koptekst
van de lijst. Daar zien we de volgende items:
- USER : Hier staat degene "onder wiens vlag" het proces
draait.
- PID : Dit is het procesnummer (Process IDentity). Daar gaan
we straks nog even mee werken...
- %CPU : geeft aan hoeveel procent van de rekenkracht van je
processor gebruikt wordt voor dit proces. Let wel: ps geeft slechts
een momentopname. De hier genoemde waardes willen nog wel eens veranderen in
de tijd. Om daar meer zicht op te krijgen bestaat er een andere opdracht, waar
we zo nog op komen.
- %MEM : geeft aan hoeveel procent van het geheugen door dit
proces gebruikt wordt. Ook dit is een momentopname!
- VSZ en RSS bespreken we hier nog niet.
- TTY : geeft aan vanaf welke "terminal" het proces gestart
is. Veel processen worden door de opstartscripts van Linux gestart, en kennen
dus geen terminal. Vandaar de vraagtekens.
- STAT : geeft de status weer van het proces. Om er enkele te
noemen: S betekent: sleeping en R betekent runnable.
- START : geeft het tijdstip, waarop het proces gestart
is.
- TIME : geeft de tijd weer, die de processor, vanaf de start
van het process, aan dit proces gewerkt heeft.
- COMMAND : vertelt, welke opdracht dit proces geschapen
heeft.
Afhankelijk van de gebruikte distributie kan de hierboven weergegeven lijst er
enigszins anders uit zien, als de essentie maar duidelijk is.
TOP
ps geeft, zoals gezegd, slechts een momentopname van de huidige
processen. Als je een continu overzicht wilt hebben moet je de Linux-opdracht
top gebruiken. Ook deze opdracht kent weer diverse opties en
mogelijkheden, dus een blik op de man-page ervan kan zeker geen kwaad.
Hieronder vind je een momentopname van een mogelijke output van top:
5:52pm up 3:37, 3 users, load average: 0,99, 1,03, 0,99
61 processes: 58 sleeping, 3 running, 0 zombie, 0 stopped
CPU states: 1,0% user, 0,0% system, 99,0% nice, 0,0% idle
Mem: 224176K av, 194028K used, 30148K free 0K shrd, 29948K buff
Swap: 478004K av, 0K used, 478004K free 86028K cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
1535 root 20 1 14532 14M 812 R N 98,9 6,4 215:08 setiathome
2045 root 9 0 44424 11M 2716 S 0,7 5,1 0:08 X
2301 jan 9 0 12676 12M 11244 R 0,1 5,6 0:00 kdeinit
1 root 8 0 484 484 420 S 0,0 0,2 0:04 init
2 root 9 0 0 0 0 SW 0,0 0,0 0:00 keventd
3 root 9 0 0 0 0 SW 0,0 0,0 0:00 kapmd
4 root 19 19 0 0 0 SWN 0,0 0,0 0:00 ksoftirqd_CPU0
5 root 9 0 0 0 0 SW 0,0 0,0 0:00 kswapd
{enz., enz...}
Ook hier gaan we even niet in op de betekenis van alle kolommen. Kijk maar
eens in de man-pages. Nog wel vermeldenswaardig is, dat de opdracht
top ook een aantal interactieve opdrachten kent, die je kunt
gebruiken, terwijl top draait. Het indrukken van de h-toets
terwijl top draait zal een eenvoudig help-scherm oproepen met een
lijst van de diverse interactieve opdrachten.
De voorgrond
Als je in een terminal een opdracht intypt (bv. ps), zal de shell
ervoor zorgen, dat die opdracht uitgevoerd wordt. Wat dan gebeurt is het
volgende:
- Je typt een opdracht achter de shell-prompt.
- De shell zorgt ervoor dat de opdracht uitgevoerd wordt.
- Als de opdracht klaar is zorgt de shell ervoor, dat de prompt weer
verschijnt, zodat je de volgende opdracht kunt geven.
Gedurende de tijd, dat de ingetypte opdracht uitgevoerd wordt, gaat de shell
in "slaap-toestand". Dit kun je zien als je een ps uitvoert: op de
regel met bash zie je als status een S. De opdracht
ps heeft gedurende de uitvoering van zijn taak even de regie in
handen gekregen. De shell krijgt die regie weer terug als ps klaar
is.
Het kan ook anders gezegd worden: de shell (bash) wordt even op de
achtergrond gezet, terwijl ps op de voorgrond zijn werk mag doen.
Er kan, per terminal, normaal gesproken maar één proces
tegelijk op de voorgrond aktief zijn. Alle andere processen doen op de
achtergrond hun werk.
Je kunt een voorgrond-proces eenvoudig afbreken, nl. met de
toetsencombinatie Ctrl-C: terwijl je de control-toets
ingedrukt houdt, druk je ook even de C-toets in. Laten we dat maar
even uitproberen:
De Linux-opdracht yes doet niets anders, dan de hele tijd het
de letter y op je beeldscherm zetten. Hij gaat daarmee door, tot hij
onderbroken wordt, bv. met Ctrl-C. Dus met Ctrl-C
beëindig je een voorgrond-proces.
Je kunt een voorgrond-proces ook tijdelijk onderbreken en wel met de
toetsencombinatie Ctrl-Z. Probeer dat maar weer met de opdracht
yes. Na het indrukken van Ctrl-Z zal de reeks
y-eren stoppen en verschijnt er een tekst als: [1]+ Stopped
yes.
De [1] is het "job"-nummer van het gestopte proces. Je kunt het
gebruiken om het proces te herstarten (dat doen we straks). Geef nu maar even
een ps x: je zult het yes-proces wel zien verschijnen, met
als status een T, wat staat voor "Traced or Stopped" (zie
man-page).
Om yes weer verder de laten werken op de voorgrond, moet je de
opdracht fg 1 geven, waarbij de 1 het job-nummer is, dat
we terugkregen toen we yes onderbraken. De letters fg staan
voor "foreground", oftewel voorgrond. Probeer maar uit en breek
yes daarna af met Ctrl-C.
De achtergrond
Je kunt een programma, en daarmee een proces, ook op de achtergrond starten
en laten lopen. Met de opdracht sleep 60 laat je de computer
gedurende 60 secondes niets doen (tenminste: niet op de voorgrond), maar de
uitvoering ervan vindt nog steeds op de voorgrond plaats. Probeer maar uit:
je zult de prompt, na het geven van de opdracht, gedurende die 60 secondes
kwijt zijn. Als je hem eerder terug wilt hebben, moet je dit voorgrondproces
afbreken met Ctrl-C.
Met sleep 60 & start je een proces op de achtergrond. Je
krijgt iets terug als [1] 918, waarbij 1 het job-nummer is
en 918 het procesnummer (PID). Je kunt het controleren met ps
x: je zult zien, dat het programma sleep er nog is, en wel met
het procesnummer dat bij de eerdere melding genoemd is. De toevoeging van een
&-teken na een opdracht zorgt er dus voor, dat de opdracht op de
achtergrond wordt uitgevoerd, tenminste: als de opdracht geen uitvoer naar
het beeldscherm genereert!
Jobs
Vooral als je meerdere programma's op de achtergrond hebt draaien, is het wel
eens moeilijk het overzicht te bewaren. Met de opdracht jobs krijg
je een overzicht van de uit deze shell gestarte processen:
[jan@gnodde linux]$ sleep 200 &
[1] 2013
[jan@gnodde linux]$ sleep 300 &
[2] 2014
[jan@gnodde linux]$ sleep 400 &
[3] 2015
[jan@gnodde linux]$ jobs
[1] Running sleep 300 &
[2]- Running sleep 400 &
[3]+ Running sleep 500 &
[jan@gnodde linux]$
De min (-) en de plus (+) laten het laatste en het
voorlaatste proces zien.
Kill
Een achtergrond-proces kun je niet afbreken met Ctrl-C. Je moet dus
wachten, tot het afgelopen is. Dan verschijnt er, als je nog eens op de
Enter-toets drukt, een tekst als: [1]+ Done
sleep 60: job nr. 1 is dus klaar, en de bijbehorende opdracht wordt ook
aangegeven: sleep 60. Je kunt echter ook het achtergrondproces naar
de voorgrond halen, en wel met de eerder genoemde opdracht fg. En
dan kun je het stoppen met Ctrl-C.
Dat is wat bewerkelijk. Er is echter ook een manier om een achtergrondproces
direct te stoppen, met de opdracht kill Daarvoor moet je wel het PID
(proces-nummer) weten van het betreffende proces. Aan het job-nummer heb je
dan niets. Laten we het maar eens uitproberen:
[jan@gnodde linux]$ sleep 60 &
[1] 1326
[jan@gnodde linux]$ ps
PID TTY TIME CMD
1003 pts/0 00:00:00 bash
1326 pts/0 00:00:00 sleep
1329 pts/0 00:00:00 ps
[jan@gnodde linux]$ kill 1326
[jan@gnodde linux]$
[1]+ Terminated sleep 60
[jan@gnodde linux]$
De ps zit er tussen om te laten zien, dat er inderdaad een proces
sleep bestaat. Het procesnummer wordt al genoemd bij het starten van
het achtergrondproces.
De opdracht kill kent natuurlijk ook weer diverse opties, die je
kunt vinden in de man-pages. Belangrijk is echter ook te weten, dat
kill verschillende graden van urgentie kent in het stoppen van
processen. Eigenlijk stuurt kill een signaal naar een proces, met
het verzoek het proces te stoppen. En zo'n verzoek kan meer of minder
dringend zijn. Ook daarover vind je informatie in de man-pages.
HUP
Als je een proces op de achtergrond gestart hebt en je logt uit (bv. met
exit, dan wordt dit proces ook beëindigd. Net als bij een
telefoon wordt er "opgehangen" (HUP staat voor HangUP). Dat kan wel
eens ongewenst zijn: soms wil je een proces laten dreaaien, ook nadat je
uitgelogd bent. Daarvoor bestaat de Linux-opdracht nohup (van "no
hangup"): nohup sleep 1000 &. Het sleep-proces wordt op de
achtergrond gestart en loopt ook door als je uitlogt (tot de 1000 secondes
voorbij zijn...). De opdracht nohup wordt dus gewoon voor de uit te
voeren opdracht geplaatst. nohup kent weinig opties, dus de
man-pages zijn snel bestudeerd...!
NICE
Met de opdracht ps -aux hebben we gezien, dat op een Linux-systeem
heel wat processen "tegelijkertijd" draaien. En als je zelf ook nog wat
programma's opstart, worden het er nog meer. In principe geeft de kernel aan
elk proces dezelfde prioriteit. Maar misschien wil je wel een programma
starten, waarvan de prioriteit wat lager mag zijn, zodat het andere (wellicht
belangrijkere) processen niet teveel vertraagt. Dat kan met de opdracht
nice, oftewel "aardig". Hiermee kun je aangeven hoe "aardig" een
proces moet zijn voor de andere processen. De waarde die je aan nice
kunt geven ligt tussen de -20 en 19. Normaal wordt een proces met een
"aardigheidsfactor" van 0 opgestart. Hoe hoger de waarde van nice,
hoe lager de prioriteit.
Een "gewone" gebruiker kan de nice-waarde van een proces alleen maar
verhogen (het proces dus een lagere prioriteit geven). Root is de enige die
een proces een hogere prioriteit kan geven.
Laten we het maar eens proberen:
[jan@gnodde linux]$ nice sleep 900 &
[1] 1166
[jan@gnodde linux]$ ps -yl
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 1001 916 915 0 75 0 1268 553 wait4 pts/0 00:00:00 bash
S 1001 1166 916 O 90 10 352 318 schedu pts/0 00:00:00 sleep
S 1001 1167 916 0 78 0 1576 900 - pts/0 00:00:00 ps
[jan@gnodde linux]$
In de kolom "NI" kun je zien, dat het proces sleep een
nice-waarde gekregen heeft van 10. Dat is de "default"-waarde van
nice. Je kunt met de optie -n ook zelf een waarde aangeven,
zolang hij (voor een gewone gebruiker) maar hoger is dan 0: nice -n 19
sleep 900 &.
Met de opdracht renice kun je de nice-waarde van een al
lopend proces wijzigen (voor een gewone gebruiker: verhogen):
[jan@gnodde linux]$ sleep 900 &
[1] 1230
[jan@gnodde linux]$ ps -yl
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 1001 916 915 0 75 0 1272 553 wait4 pts/0 00:00:00 bash
S 1001 1230 916 0 76 0 352 318 schedu pts/0 00:00:00 sleep
R 1001 1231 916 0 78 0 1576 900 - pts/0 00:00:00 sleep
[jan@gnodde linux]$ renice 5 1230
[jan@gnodde linux]$ ps -yl
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 1001 916 915 0 75 0 1272 553 wait4 pts/0 00:00:00 bash
S 1001 1230 916 0 85 5 352 318 schedu pts/0 00:00:00 sleep
S 1001 1231 916 0 77 0 1576 900 - pts/0 00:00:00 ps
[jan@gnodde linux]$
Aan de veranderde waarde in de kolom "NI" kun je zien, dat renice
z'n werk gedaan heeft. Ook hier geldt weer: alleen root kan de
nice-waarde verlagen (de prioriteit verhogen).
Slot
Dit is allemaal ingewikkelde en droge stof. Toch is het belangrijk om te
weten hoe Linux met zaken als processen omgaat en hoe je zelf in kunt
grijpen. Oefen er maar eens mee en lees vooral de man- en/of info-pages goed
door!
Nog even de hier behandelde opdrachten:
Laatst herzien op 18-12-2006
|