<chapter>
<title>Processen</title> <?dbhtml filename="processen.html"?>

<sect1>
<title>Inleiding</title>

<para>
Elk programma wat gestart wordt is in wezen een proces. Het kan voorkomen dat een gestart programma zichzelf in meerdere taken verdeelt. In zo'n geval worden er meerdere processen gestart. Een voorbeeld van een programma dat zich in meerdere 'sub' taken verdeeld in de apache web server. Je ziet dan meerdere processen met dezelfde naam, in dit geval httpd. 
Onder de noemer programma kun je in dit geval zowel een systeem programma (ook wel daemon genoemd) verstaan als een programma die je als "gewone" gebruiker start, zoals je email programma. Dus elk gestart programma start als het ware een of meerdere processen op.
</para>

<para>
Elk proces is gekoppeld aan een gebruiker. Zo kunnen er bijvoorbeeld processen zijn die aan de root gebruiker zijn gekoppeld en processen die je zelf hebt gestart en die dus gekoppeld zijn aan jezelf.
</para>

<para>
Processen kunnen op meerdere manieren actief zijn. Voorbeeld daarvan zijn processen die op de voorgrond of op de achtergrond lopen. 
</para>

</sect1>


<sect1>
<title>Voorgrond processen</title>

<para>
Een voorgrond proces is bijvoorbeeld een programma wat een gebruiker start vanuit een shell, bijvoorbeeld een email programma of een editor. Een typerend kenmerk van een voorgrond proces is dat het toetsenbord en beeldscherm gekoppeld zijn aan dat voorgrond proces. Er wordt in dit geval ook wel gesproken van 'Controling Terminal'. 
</para>

<para>
Een proces kan in de voorgrond gestart worden door vanuit de shell prompt een opdracht of programma naam in te typen. Voorbeeld:
</para>

<screen>
$ <command>vi</command>
</screen>

<para>
Bovenstaand voorbeeld start de vi editor in de voorgrond (foreground). 
</para>

<para>
Je kunt, als een voorgrond proces eenmaal gestart is, deze naar de achtergrond verbannen. Om een proces wat als voorgrond proces gestart is naar de achtergrond te verplaatsen, gebruik je de toetsen combinatie Crtl-Z. Op deze manier zet je het proces naar de achtergrond in de wacht. Hierna gebruik je het commando 'bg' om het proces verder op de achtergrond te laten lopen. Je kunt met het commando <command>jobs</command> een overzicht krijgen van taken die vanuit de shell gestart zijn:
</para>

<screen>
$ <command>jobs</command>
</screen>

<para>
De output zou als volgt kunnen zijn:
</para>

<screen>
[1]-	Stopped		vi
[2]	Running		xmms &amp;
[3]+	Stopped		top		
</screen>

<para>
In bovenstaand voorbeeld zie je drie processen die vanuit de shell gestart zijn. Het proces (lees : job) xmms loopt zoals je ziet in de achtergrond. De andere twee staan te wachten. Je kunt een wachtend proces of een proces wat in de achtergrond draait naar de voorgrond halen. Zoals je ziet heeft elk proces een nummer. Dit zijn in dit geval geen proces id's, maar een soort van 'job nummers'. Als je nu de job xmms weer naar de voorgrond wil halen dan kun je dit als volgt doen:
</para>

<screen>
$ <command>fg 2</command>
</screen>

<para>
Met bovenstaand commando haalt je het achtergrond proces met 'job' nummer 2 weer naar de voorgrond (met het commando <command>fg</command>). Het - teken in de lijst van de output van het <command>job</command> commando staat voor het laatst gestart proces en het + teken voor het voorlaatst gestarte proces.
</para>

</sect1>

<sect1>
<title>Achtergrond processen</title>

<para>
Een achtergond proces is een proces wat niet gekoppeld is aan het toetsenbord en beeldscherm. Dit proces is wel actief, alleen dat lopende proces is niet te "zien" via je beeldscherm.
</para>

<para>
Een proces kun je als volgt in de achtergrond starten:
</para>

<screen>
$ <command>xmms &amp;</command>
</screen>

<para>
Het ampersand (&amp;) teken wordt gebruikt om een proces in de achtergrond te starten. Als je nu het commando <command>jobs</command> gebruikt zie je dat een proces in de achtergrond verder loopt. Let wel : dit geldt niet voor elk proces. Er zijn programma's die in de achtergrond alleen in de wacht gezet kunnen worden. Een voorbeeld hiervan is de editor vi, welke alleen gesuspend (in de wacht gezet) kan worden. 
</para>

<screen>
[1] 	Running		sleep 10000 &amp;	
[2] 	Running		xmms &amp;
[3]	Stopped		vi
</screen>

<para>
Zoals je ziet is de status van twee jobs running en die van vi stopped terwijl ze alledrie op dezelfde manier gestart zijn (met het '&amp;' teken).
</para>

</sect1>

<sect1>
<title>ps</title>


<para>
Het commando <command>ps</command>(1) gebruik je om een overzicht te 
krijgen van processen
onafhankelijk of ze in de voorgrond of achtergrond draaien. Elk proces
krijgt een nummer toegewezen, een zogenaamd proces id. Dit proces id,
ook wel PID genoemd, kan erg nuttig zijn om te weten. Het commando
<command>ps</command> kent verschillende opties die je mee kunt
geven. Als je geen opties mee geeft, dan krijg je alleen een lijst van
de processen die door je zelf gestart zijn. Voorbeeld:

</para>

<screen>
$ <command>ps</command>
PID	TTY	TIME		CMD
12	pts/1	00:00:00	bash
15	pts/1	00:00:00	vi
</screen>


<para>
In bovenstaand voorbeeld staat PID voor het proces ID, TTY is de
terminal die bij dit proces hoort, TIME geeft de gebruikte CPU tijd
aan tot op heden en CMD staat voor de naam van het gestarte programma.
Als je dit commando uitbreid met een aantal opties, bijvoorbeeld de
opties a, u en x als volgt: </para>

<screen>
$ <command>ps -aux</command>
</screen>

<para>
dan kan de output er als volgt uitzien:
</para>

<screen>
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   448   64 ?        S    12:21   0:03 init
root         2  0.0  0.0     0    0 ?        SW   12:21   0:00 [keventd]
root         3  0.0  0.0     0    0 ?        SW   12:21   0:00 [kapmd]
root         4  0.0  0.0     0    0 ?        SWN  12:21   0:00 [ksoftirqd_CPU0]
root         5  0.0  0.0     0    0 ?        SW   12:21   0:01 [kswapd]
root         6  0.0  0.0     0    0 ?        SW   12:21   0:00 [bdflush]
root         7  0.0  0.0     0    0 ?        SW   12:21   0:00 [kupdated]
root         8  0.0  0.0     0    0 ?        SW   12:21   0:00 [kinoded]
root         9  0.0  0.0     0    0 ?        SW&lt;  12:21   0:00 [mdrecoveryd]
</screen>

<para>
Zie de manual page van het <command>ps</command> commando voor meer uitleg 
(<command>man ps</command>).
</para>

</sect1>

<sect1>
<title>Signalen</title>

<para>
Met het commando <command>kill</command>(1) kun je processen be&iuml;nvloeden. Dit commando kun je gebruiken om processen te stoppen, maar bijvoorbeeld ook om ze te herstarten. Om processen te be&iuml;nvloeden die van een andere gebruiker zijn, moet je dit commando als root gebruiker uitvoeren. Je kunt wel als gewone gebruiker je eigen processen be&iuml;nvloeden.
</para>

<para>
Bij het commando KILL draait het eigenlijk om het sturen van een signaal naar een proces. Je kunt verschillende signalen naar een proces sturen en standaard wordt het TERM signaal naar een proces gestuurd wat in feite zegt: proces be&euml;indig je zelf. Hieronder volgt een overzicht van een aantal verschillende signalen die je naar een proces kan sturen.
</para>

<screen>
 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	17) SIGCHLD
</screen>

<para>
De meest gebruikte signalen zijn TERM voor stoppen, KILL als een proces hardhandig de nek omgedraaid moet worden en HUP als een proces herstart moet worden. Dus als een proces het signaal HUP (hang-up) ontvangt, zal dit proces zich herstarten.
</para>

<para>
Niet alle signalen worden door het proces zelf verwerkt. Als een proces zelf nergens meer op reageert kun je deze met een SIGKILL stoppen. Dit signaal wordt door de kernel verwerkt. 
</para>

<para>
Zoals je misschien opgevallen is, beginnen alle signalen met de letters SIG. Als je een signaal wilt versturen naar een proces, dan kun je dit als volgt doen:
</para>

<screen>
$ <command>kill -optie PID</command>
</screen>

<para>
Op de plaats van 'optie' plaats je een deel van een signaal wat je wilt versturen. Stel je wilt een SIGTERM versturen, dan vul je op de plaats van de optie het woord TERM in. Op de plaats van PID vul je het proces ID in, welke je op kunt zoeken met het PS commando.
</para>

<para>
Overigens kun je in plaats van de woorden TERM, HUP en dergelijke ook met getallen werken. Met het commando <command>kill -l</command> zie je een lijst van de signalen met de bijbehorende getallen. Het commando wordt dan:
</para>

<screen>
$ <command>kill -1 xmms</command>
</screen>

<para>
Bovenstaand commando stuurt een boodschap naar het proces dat hij zichzelf moet herstarten (HUP).
</para>


</sect1>

<sect1>
<title>Top</title>

<para>
Het commando <command>top</command>(1) kun je gebruiken om dynamische
informatie over processen te zien. Dynamisch in de zin dat je direct
veranderingen kunt zien, bijvoorbeeld t.a.v. CPU verbruik, hoeveel
processen er actief zijn en dergelijke. Dit commando voer je als volgt
uit: </para>

<screen>
$ <command>top</command>
</screen>

<para>
De uitvoer van dit programma kan er als volgt uitzien:
</para>

<screen>
  9:18pm  up  8:57,  7 users,  load average: 0.03, 0.05, 0.06
73 processes: 71 sleeping, 1 running, 0 zombie, 1 stopped
CPU states:  3.7% user,  0.7% system,  0.0% nice, 95.4% idle
Mem:   223152K av,  190712K used,   32440K free,       0K shrd,    4920K buff
Swap:  104412K av,   13028K used,   91384K free                  119232K cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
14678 neskio    19   0   980  980   764 R     2.7  0.4   0:00 top
    1 root      20   0    76   64    44 S     0.0  0.0   0:03 init
    2 root      20   0     0    0     0 SW    0.0  0.0   0:00 keventd
    3 root      20   0     0    0     0 SW    0.0  0.0   0:00 kapmd
    4 root      20  19     0    0     0 SWN   0.0  0.0   0:00 ksoftirqd_CPU0
    5 root      20   0     0    0     0 SW    0.0  0.0   0:01 kswap
    6 root      20   0     0    0     0 SW    0.0  0.0   0:00 bdflush
    7 root      20   0     0    0     0 SW    0.0  0.0   0:00 kupdated
    8 root      20   0     0    0     0 SW    0.0  0.0   0:00 kinoded
    9 root       0 -20     0    0     0 SW&lt;   0.0  0.0   0:00 mdrecoveryd
  380 root      20   0   256  216   144 S     0.0  0.0   0:00 syslogd
  383 root      20   0   672  172   116 S     0.0  0.0   0:00 klogd
  419 root      20   0     0    0     0 SW    0.0  0.0   0:00 khubd
  605 root      19   0   188    4     4 S     0.0  0.0   0:00 cardmgr
  618 bin       20   0   224  192   136 S     0.0  0.0   0:00 portmap
  665 root      18   0   252    4     4 S     0.0  0.0   0:00 sshd
  696 at        20   0   152  100    64 S     0.0  0.0   0:00 atd
  719 lp        20   0   548  520   424 S     0.0  0.2   0:00 lpd
  761 root      20   0   172  112    76 S     0.0  0.0   0:00 cron
  779 mail      20   0   816  308   216 S     0.0  0.1   0:00 sendmail
  785 root      20   0   972  364   232 S     0.0  0.1   0:00 sendmail
  863 root      20   0   448  416   296 S     0.0  0.1   0:00 nscd
  868 root      20   0   448  416   296 S     0.0  0.1   0:00 nscd
</screen>

</sect1>
</chapter>
