Beetje Coderen

Les 6

Processen en signalen

Draaiende programma's bekijken, stoppen en op de achtergrond zetten.

⏱ 45–60 minuten leestijd + oefenen

🎯 Na deze les kun je

  • processen bekijken met ps en top
  • processen stoppen met kill
  • jobs op de achtergrond draaien

Elk programma dat draait, is een proces. Je shell is een proces, de webserver is er een (of tien), en zelfs ls is heel even een proces. Soms gaat er iets mis: een programma blijft hangen, of slokt alle rekenkracht op en de server wordt traag. Dan moet je het kunnen vinden en stoppen. In deze les leer je processen bekijken, ze signalen sturen, en programma's op de achtergrond laten draaien.

Processen bekijken met ps

$ ps
    PID TTY          TIME CMD
   1201 pts/0    00:00:00 bash
   1388 pts/0    00:00:00 ps

Zonder opties toont ps alleen de processen in je eigen terminal. Elk proces heeft een uniek nummer, de PID (process ID). Alle processen van het hele systeem zie je met:

$ ps aux
USER   PID %CPU %MEM    VSZ   RSS TTY  STAT START   TIME COMMAND
root     1  0.0  0.1 167700 11520 ?    Ss   09:12   0:01 /sbin/init
root   612  0.0  0.0  15420  7680 ?    Ss   09:12   0:00 sshd: /usr/sbin/sshd -D
www-data 803 0.1 0.4 55220 34100 ?   S    09:12   0:04 nginx: worker process
student 1201 0.0  0.0   8960  5300 pts/0 Ss  10:20   0:00 -bash
Kolom Betekenis
USER onder welke gebruiker het proces draait (les 4)
PID procesnummer
%CPU, %MEM aandeel processor en geheugen
STAT toestand: R draait, S slaapt (wacht), Z zombie, T gestopt
COMMAND het commando dat het proces startte

PID 1 is het eerste proces dat de kernel start; meestal systemd (les 8). Alle andere processen stammen ervan af: elk proces heeft een ouder (parent), met een PPID. ps -ef --forest of pstree toont die boom.

Zoeken doe je met grep (les 3) of direct met pgrep:

$ ps aux | grep nginx
$ pgrep -a nginx
803 nginx: worker process

top en htop: live meekijken

ps is een momentopname. top ververst elke paar seconden en zet de zwaarste processen bovenaan:

top - 10:31:02 up  1:18,  1 user,  load average: 1.02, 0.61, 0.33
Tasks:  92 total,   2 running,  90 sleeping,   0 stopped,   0 zombie
%Cpu(s): 50.3 us,  0.4 sy,  0.0 ni, 49.1 id,  0.0 wa
MiB Mem :   3936.2 total,   2410.8 free,    612.3 used,    913.1 buff/cache

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   1422 student   20   0    8496   1792   1664 R 100.0   0.0   0:31.12 yes

Handige toetsen in top: P sorteren op CPU, M op geheugen, k een proces stoppen, q afsluiten.

De load average (drie getallen: gemiddelde over 1, 5 en 15 minuten) zegt hoeveel processen gemiddeld op de processor wachten of erop draaien. Ligt het getal ruim boven het aantal processorkernen (nproc), dan heeft de machine het druk.

htop doet hetzelfde met kleuren, muisbediening en een overzichtelijkere weergave. Het is niet altijd geïnstalleerd (les 7).

Signalen

Een proces stop je door het een signaal te sturen: een kort bericht van het besturingssysteem. De belangrijkste:

Signaal Nummer Betekenis
SIGTERM 15 "stop alsjeblieft": het proces kan netjes afronden (bestanden opslaan, verbindingen sluiten). Standaard bij kill.
SIGINT 2 onderbreken; wat Ctrl+C stuurt
SIGKILL 9 direct stoppen door de kernel; het proces kan niets meer afronden
SIGHUP 1 oorspronkelijk "terminal gesloten"; veel diensten lezen hierbij hun configuratie opnieuw in
SIGSTOP / SIGCONT 19 / 18 pauzeren / verder laten gaan (Ctrl+Z stuurt een verwant signaal)

kill -l toont ze allemaal.

kill en killall

Ondanks de naam stuurt kill gewoon een signaal:

kill 1422            # SIGTERM naar PID 1422
kill -9 1422         # SIGKILL, als SIGTERM niet helpt
killall yes          # SIGTERM naar alle processen met de naam "yes"
pkill -u sam         # SIGTERM naar alle processen van gebruiker sam

Werkwijze bij een hangend proces:

  1. Zoek het: top (sorteer met P) of pgrep -a naam.
  2. Probeer netjes: kill PID. Wacht een paar seconden.
  3. Controleer: ps -p PID. Nog steeds daar? Dan kill -9 PID.

Begin niet met kill -9. Een proces dat met SIGKILL gestopt wordt, kan half geschreven bestanden of een beschadigde database achterlaten. En controleer de PID twee keer: kill -9 op het verkeerde nummer kan je sessie of een belangrijke dienst stoppen. Processen van andere gebruikers stoppen kan alleen met sudo.

Jobs: voorgrond en achtergrond

Normaal wacht je shell tot een commando klaar is: het draait op de voorgrond. Met & start je het op de achtergrond en krijg je je prompt meteen terug:

$ sleep 300 &
[1] 1530
$ jobs
[1]+  Running                 sleep 300 &

[1] is het jobnummer in deze shell, 1530 de PID.

Commando / toets Doet
commando & starten op de achtergrond
Ctrl+Z voorgrondproces pauzeren
jobs jobs van deze shell tonen
bg %1 gepauzeerde job 1 op de achtergrond verder laten gaan
fg %1 job 1 naar de voorgrond halen
kill %1 job 1 stoppen

Een typisch scenario: je start een lange kopieeropdracht, bedenkt dat je de terminal nodig hebt, drukt Ctrl+Z en typt bg. De kopie loopt door en jij kunt verder.

nohup: blijven draaien na uitloggen

Achtergrondjobs horen bij je shell. Log je uit (of valt je SSH-verbinding weg, les 10), dan krijgen ze een SIGHUP en stoppen ze meestal. Met nohup negeert een proces dat signaal:

nohup ./lange-berekening.sh > berekening.log 2>&1 &

De uitvoer gaat naar berekening.log (redirects uit les 3). Voor diensten die altijd moeten draaien, gebruik je geen nohup maar systemd (les 8). Voor een interactieve sessie die je later wilt hervatten, zijn tmux of screen handig.

Oefenen

Oefening 1. Start sleep 600 op de achtergrond, zoek de PID op twee manieren, en stop het proces netjes.

Modelantwoord oefening 1
sleep 600 &
jobs -l              # toont jobnummer en PID
pgrep -a sleep       # zoekt op naam
kill %1              # of: kill <PID>

Oefening 2. Je server is traag. Welke stappen zet je om de oorzaak te vinden?

Modelantwoord oefening 2

Open top. Kijk naar de load average ten opzichte van nproc. Sorteer op CPU (P) en daarna op geheugen (M). Noteer het proces, de gebruiker en de PID bovenaan. Ga na wat het is (ps -fp PID) voordat je besluit het te stoppen.

Oefening 3. Waarom stuur je eerst SIGTERM en pas daarna SIGKILL?

Modelantwoord oefening 3

SIGTERM laat het proces netjes afronden: gegevens opslaan, tijdelijke bestanden opruimen, verbindingen sluiten. SIGKILL stopt het meteen, en wat half af was, blijft half af. SIGKILL is het laatste redmiddel.

Lab: een op hol geslagen proces

  1. Start het lab: docker run -it --rm registry.wizg.it/webhosting/beetjecoderen-web:lab-linux-latest.
  2. Start het probleem met beetje start les6 (in het live lab draait het al): er draait nu een proces dat niet wil stoppen. Zoek het met top of ps aux en noteer de PID en de naam in ~/antwoorden/proces.txt (formaat: PID naam). Op een echte server zou zo'n proces vaak 100% CPU gebruiken; in het lab slaapt het, zodat je werkplek bruikbaar blijft.
  3. Stop het netjes met SIGTERM. Het negeert dat. Stop het daarna met SIGKILL.
  4. Start ~/bin/teller.sh op de voorgrond, pauzeer het met Ctrl+Z en laat het op de achtergrond verdergaan.
  5. Start ~/bin/teller.sh nog een keer met nohup, met de uitvoer naar ~/teller.log.
  6. Controleer met beetje check les6.

Samenvatting

  • Elk draaiend programma is een proces met een PID; ps aux toont ze allemaal, pgrep -a zoekt op naam.
  • top/htop laten live zien welke processen CPU en geheugen gebruiken.
  • Je stopt een proces met een signaal: eerst kill PID (SIGTERM), pas daarna kill -9 PID (SIGKILL).
  • & start op de achtergrond; Ctrl+Z, bg, fg en jobs beheren jobs.
  • nohup laat een proces doorlopen na uitloggen; diensten beheer je met systemd.

In les 7 installeer je software met de pakketbeheerder, zodat je tools als htop zelf kunt toevoegen.

Lab

Een op hol geslagen proces vinden en stoppen

🔒 Het live lab hoort bij de volledige cursus. Met één aankoop (€ 19,00, eenmalig) krijg je alle lessen, de live labs en het certificaat. Geen abonnement. Je kunt dit lab altijd gratis lokaal met Docker doen.

Cursus kopen en verdergaan

💻 Lokaal met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):

$ docker run -it --rm -e BEETJE_COURSE=een-beetje-linux-en-docker -e BEETJE_LESSON=6 registry.wizg.it/webhosting/beetjecoderen-web:lab-linux-latest

Krijg je unauthorized bij het downloaden? De registry vraagt een login. Bouw het image dan eerst zelf (eenmalig, een paar minuten):

$ docker build -t registry.wizg.it/webhosting/beetjecoderen-web:lab-linux-latest -f linux.Dockerfile https://beetjecoderen.nl/labs/lab-images.tar.gz

In de container: beetje lijst toont alle lessen van het image.

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker.

Klaar? Controleer je werk met:

$ beetje check les6

📝 Quiz: processen en signalen

6 vragen · 70% nodig om te slagen

1. Welk signaal stuurt `kill 1234` standaard?
2. Wanneer gebruik je `kill -9`?
3. Hoe start je een commando op de achtergrond?
4. Je hebt een programma gepauzeerd met Ctrl+Z. Hoe laat je het op de achtergrond verdergaan?
5. Wat is een PID?
6. Welk commando laat live zien welke processen de meeste CPU gebruiken?