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.
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.
Processen kunnen op meerdere manieren actief zijn. Voorbeeld daarvan zijn processen die op de voorgrond of op de achtergrond lopen.
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'.
Een proces kan in de voorgrond gestart worden door vanuit de shell prompt een opdracht of programma naam in te typen. Voorbeeld:
$ vi
Bovenstaand voorbeeld start de vi editor in de voorgrond (foreground).
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 'jobs' een overzicht krijgen van taken die vanuit de shell gestart zijn:
$ jobs
De output zou als volgt kunnen zijn:
[1]- Stopped vi [2] Running xmms & [3]+ Stopped top
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:
$ fg 2
Met bovenstaand commando haalt je het achtergrond proces met 'job' nummer 2 weer naar de voorgrond (met het commando 'fg'). Het - teken in de lijst van de output van het 'job' commando staat voor het laatst gestart proces en het + teken voor het voorlaatst gestarte proces.
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.
Een proces kun je als volgt in de achtergrond starten:
$ xmms &
Het ampersand (&) teken wordt gebruikt om een proces in de achtergrond te starten. Denk om de spatie tussen het commando en het '&'. Als je nu het commando 'jobs' 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.
[1] Running sleep 10000 & [2] Running xmms & [3] Stopped vi
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 '&' teken).
Het commando 'ps' 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 ps 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:
PID TTY TIME CMD 12 pts/1 00:00:00 bash 15 pts/1 00:00:00 vi
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:
$ ps -aux
dan kan de output er als volgt uitzien:
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< 12:21 0:00 [mdrecoveryd]
Zie de manual page van het 'ps' commando voor meer uitleg (man ps).
Met het commando 'kill' kun je processen beinvloeden. Dit commando kun je gebruiken om processen te stoppen, maar bijvoorbeeld ook om ze te herstarten. Om processen te beinvloeden die van een andere gebruiker zijn, moet je dit commando als root gebruiker uitvoeren. Je kunt wel als gewone gebruiker je eigen processen beinvloeden.
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 beeindig je zelf. Hieronder volgt een overzicht van een aantal verschillende signalen die je naar een proces kan sturen.
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
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.
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.
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:
$ kill -optie PID
Op de plaats van 'optie' plaats je een deel van een signaal wat je wilt verturen. 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.
Overigens kune je in plaats van de woorden TERM, HUP en dergelijke ook met getallen werken. Met het commando kill -l zie je een lijst van de signalen met de bijbehorende getallen. Het commando wordt dan:
$ kill -1 xmms
Bovenstaand commando stuurt een boodschap naar het proces dat hij zichzelf moet herstarten (HUP).
Het commando top kun je gebuiken 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:
$ top
De uitvoer van dit programma kan er als volgt uitzien:
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< 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