Les 6
Processen en signalen
Draaiende programma's bekijken, stoppen en op de achtergrond zetten.
🎯 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:
- Zoek het:
top(sorteer metP) ofpgrep -a naam. - Probeer netjes:
kill PID. Wacht een paar seconden. - Controleer:
ps -p PID. Nog steeds daar? Dankill -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
- Start het lab:
docker run -it --rm registry.wizg.it/webhosting/beetjecoderen-web:lab-linux-latest. - 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 mettopofps auxen 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. - Stop het netjes met SIGTERM. Het negeert dat. Stop het daarna met SIGKILL.
- Start
~/bin/teller.shop de voorgrond, pauzeer het met Ctrl+Z en laat het op de achtergrond verdergaan. - Start
~/bin/teller.shnog een keer metnohup, met de uitvoer naar~/teller.log. - Controleer met
beetje check les6.
Samenvatting
- Elk draaiend programma is een proces met een PID;
ps auxtoont ze allemaal,pgrep -azoekt op naam. top/htoplaten live zien welke processen CPU en geheugen gebruiken.- Je stopt een proces met een signaal: eerst
kill PID(SIGTERM), pas daarnakill -9 PID(SIGKILL). &start op de achtergrond; Ctrl+Z,bg,fgenjobsbeheren jobs.nohuplaat 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.
💻 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
$ docker build -t registry.wizg.it/webhosting/beetjecoderen-web:lab-linux-latest -f linux.Dockerfile https://beetjecoderen.nl/labs/lab-images.tar.gz
Klaar? Controleer je werk met:
$ beetje check les6