Valid HTML 4.01! Valid CSS
Anybrowser

Navigatie:


Home - Linux beginners - Procesbeheer

logo

.



Home
Printbaar

Nieuws

Nieuwe distributie
Onlangs zijn we overgestapt op een nieuwe Linux-distributie, nl. Pardus Linux

Dit lijkt ons een prima distributie, zowel voor beginners als experts.



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:


ps top yes sleep fg
jobs kill nohup nice renice


Laatst herzien op 18-12-2006