Opdracht 12 - Processen in Linux¶
Doel¶
Tijdens deze opdracht zullen we met eenvoudige commando's de werking van processen en hun bijbehorende informatie achterhalen op zowel een Linux- als Windows-besturingssysteem. De commando's in Linux worden uitgevoerd in een Bash-terminal, die voor Windows via een PowerShell-console.
Na deze opdracht kan je:
- Een overzicht van alle processen opvragen
- Een overzicht van alle processen van de gebruiker opvragen
- Een detailoverzicht van één proces opvragen
- Een proces starten, pauzeren en stoppen
Verloop¶
Tekst in een grijs kader zijn commando's die je zal uitvoeren in de terminal van jouw Ubuntu VM. Af en toe zal je ook een vraag tegenkomen waarbij je bv. zelf het commando moet zoeken of een bepaalde actie moet uitvoeren.
Voor deze opdracht neem je de tekst stap voor stap door en voer je, indien gegeven, de commando's uit.
Doorheen de tekst en in de commando's zal je vaak tekst tussen < > zien staan. Dit betekent dat je deze moet vervangen door een passende waarde voor jouw situatie. Bijvoorbeeld: ps <procesid> wordt voor een proces met id 15 dus ps 15.
Je kan een huidig proces/commando altijd stoppen met "Ctrl + c".
Voorbereiding¶
We gaan er van uit dat je reeds een werkende VM voor Ubuntu hebt (zie vorige opdrachten).
Voor we de rest van deze opdracht kunnen uitvoeren moeten we eerst een script naar onze virtuele machine kopiëren. Het bash script (extensie .sh) is voor Ubuntu bedoelt en kan je hier downloaden.
Bestanden overzetten naar virtuele machines (in de cloud) gebeurt altijd via SSH File Transfer Protocol (SFTP). Dit gaan we in deze opdracht ook lokaal simuleren met onze Ubuntu VM.
We gaan er ook van uit dat je reeds WinSCP of een gelijkaardig programma hebt geïnstalleerd (op jouw persoonlijk toestel) tijdens opdracht 1 van System Engineering Lab. Indien niet, installeer dit eerst via een van volgende commando's:
- Windows:
winget install --id WinSCP.WinSCP - macOS:
brew install --cask cyberduck - Ubuntu:
sudo apt install -y filezilla - Andere Linux distributies: installeer FileZilla via de package manager van jouw distributie
Open vervolgens de netwerkinstellingen van jouw Ubuntu VM (in VirtualBox) en klik bij de 1e adapter op "Geavanceerd" en dan op "Poortdoorverwijzing".

Voeg een nieuwe regel toe met de volgende gegevens. Hiermee zorgen we ervoor dat verkeer op poort 2222 van jouw host systeem wordt doorgestuurd naar poort 22 van jouw virtuele machine. Op die manier kunnen we eenvoudig verbinden met de SSH service van de Ubuntu VM op localhost:2222.
- Naam: SSH
- Protocol: TCP
- Host poort: 2222
- Gast poort: 22

Start je Ubuntu virtuele machine. Na het aanmelden open je een nieuwe terminal. Dit kan op verschillende manieren:
- Toetsencombinatie:
Ctrl - Alt - T - Grafisch: Klik rechtsonder op "Activiteiten", zoek naar terminal en klik om te openen
Eens geopend kan je links in de lijst van favoriete applicaties rechtsklikken op je terminal en kiezen voor "Voeg toe aan favorieten" (of "Pin to Dash"). Zo kan je de volgende keer snel vanuit deze lijst telkens een terminal starten.
Allereerst installeren we de OpenSSH-server op onze Ubuntu VM. Dit is nodig om bestanden via SCP te kunnen kopiëren. Voer hiervoor de volgende commando's uit:
Controleer of de SSH service actief en enabled is:
| Bash | |
|---|---|
Indien de service niet actief is, kan je deze activeren en enablen met:
Open vervolgens WinSCP (of een gelijkaardig programma) op jouw persoonlijk toestel. Vul de volgende gegevens in:
- Bestandsprotocol: SFTP
- Adres doelcomputer (= hostnaam): localhost
- Poortnummer: 2222
- Gebruikersnaam: osboxes
- Wachtwoord: osboxes.org
Je mag deze gegevens opslaan zodat je deze niet telkens opnieuw moet ingeven. Klik op "Inloggen" om de verbinding te maken.

Klik op "Akkoord" (of gelijkaardig) om de host sleutel te accepteren. In het linkerdeel van het scherm zie je nu de bestanden van jouw persoonlijk toestel en in het rechterdeel de bestanden van jouw Ubuntu VM.
Navigeer links naar de locatie waar je het script hebt opgeslagen en rechts naar de map "Documents" van jouw Ubuntu VM. Sleep het script van links naar rechts om het te kopiëren.

Processen in Linux¶
Overzicht commando's¶
Volgende tabel bevat een overzicht van alle commando's die aan bod zullen komen tijdens deze opdracht.
| Omschrijving | Commando Linux (Bash) |
|---|---|
| Overzicht van alle processen in Linux | ps |
| Overzicht van processen per gebruiker | ps -aux |
| Overzicht van details van een proces | ps <procesid> |
| Overzicht van de processtructuur | pstree |
| Overzicht van alle actieve processen met automatische verversing | top |
| Id van een proces zoeken | pidof <procesnaam> |
| Proces stopzetten | kill <pid> |
| Proces laten wachten | sleep <seconden> |
| Op de achtergrond starten | <commando> & |
Overzicht processen¶
Open een terminal op jouw Ubuntu VM, indien je dit nog niet gedaan hebt.
We beginnen met het tonen van een overzicht van de huidige processen die op ons systeem draaien:
| Bash | |
|---|---|
Als je het bovenstaande commando uitvoert, krijg je een lijst van processen te zien, vergelijkbaar met de onderstaande afbeelding:

Via deze uitvoer kan je zien welke processen er actief zijn, maar alleen die in de terminal zelf. We zien ook welk id elk proces heeft (PID), welk commando gebruikt werd om het proces te starten en hoeveel CPU-tijd het al heeft verbruikt.
Vervolgens zullen we het overzicht uitbreiden en meer informatie per proces tonen, evenals de processen gegroepeerd per gebruiker. Hiervoor voeren we het volgende commando uit:
| Bash | |
|---|---|
Dit levert een overzicht op zoals hieronder getoond (de echte uitvoer bevat veel meer processen):

Hieruit kunnen we veel meer informatie aflezen in vergelijking met het basiscommando ps:
- User: toont de eigenaar van het proces
- %CPU en %MEM: procentuele belasting van de processor en het geheugen
- Start: tijdstip waarop het proces gestart werd
Je kan deze informatie ook vergelijken met de informatie die grafisch beschikbaar is via de "System Monitor". Open deze grafische applicatie (Activiteiten => Systeemmonitor). Zoek nu voor een aantal processen op basis van hun id de informatie op in zowel de terminal uitvoer als het grafische venster. Gevonden?

Probeer nu om de details van een van jouw eigen processen op te vragen in de shell.
Welk commando gebruik je hiervoor?
| Bash | |
|---|---|
Je kan ook via de terminal een overzicht opvragen van de meest belastende processen op jouw systeem. Dit doe je via het commando top.

Je kan het overzicht verlaten met de toets "q" of de toetsencombinatie "Ctrl + c".
Processtructuur¶
Daarnaast kunnen we ook een overzicht van alle processen opvragen in een boomstructuur. Het voordeel van deze structuur is dat we de onderlinge samenhang van processen kunnen zien. Met andere woorden, we zien de ouder van elk proces en zijn kinderen.
| Bash | |
|---|---|

Wat valt nu op uit dit overzicht? De boomstructuur van de processen start vanaf systemd. Dit is het hoofdproces van het besturingssysteem waar alle andere processen als kind aan verbonden zijn. Deze informatie vinden we ook terug via ps, omdat het rootproces systemd daar id 1 heeft. Ook de grafische omgeving (GDM) gebruikt zijn eigen kindprocessen om volledig te kunnen werken.
Nieuw proces opstarten¶
Start nu een aantal nieuwe grafische processen naar keuze, bijvoorbeeld: een nieuwe terminal, bestandsbeheer, Firefox, rekenmachine, enzovoort. Probeer deze processen terug te vinden in de lijst van processen op de verschillende manieren zoals in de vorige paragraaf besproken.
Open niet alleen via de grafische manier, maar ook via de shell een nieuw proces "Firefox". Bekijk zeker de "System Monitor" en de uitvoer van pstree.
Wat merk je op?
Via pstree en "System Monitor" zien we maar één keer Firefox als proces in de lijst staan, maar via ps -aux blijkt dat het Firefox toch als meerdere processen is gestart. Als je goed vergelijkt zal je zien dat in de "System Monitor" de subprocessen van Firefox als "MainThread" of "Web Content" getoond worden. Deze kan je ook terugvinden in pstree uitvoer.
Sluit alle openstaande programma's af, behalve de terminal en "System Monitor". Start nu in jouw terminal een nieuw proces met het commando gedit. Er wordt een grafische tekstverwerker (Gnome Editor) opgestart. Zoals je merkt, is jouw terminal nu "bevroren". Omdat je het proces op de voorgrond gestart hebt, zal jouw terminal niet meer reageren op nieuwe commando's zolang de tekstverwerker nog open staat. Dit is uiteraard niet handig omdat we graag onze terminal nog willen kunnen gebruiken. Dit kunnen we oplossen door het commando in de achtergrond van de terminal te starten. Sluit eerst gedit af en keer terug naar de terminal. Start gedit nu opnieuw op, maar als achtergrondproces, als volgt:
| Bash | |
|---|---|
De tekstverwerker zal nog steeds gestart worden zoals voorheen, maar we behouden nu de controle over de terminal en kunnen dus nieuwe instructies in de terminal ingeven en uitvoeren.
Als extra zullen we ook kort toelichten hoe een proces automatisch gestart kan worden. We zullen als voorbeeld in Linux inplannen dat elke minuut de tijd geprint wordt naar het bestand /home/osboxes/tijd.txt. Dit zullen we doen door middel van crontab.
Controleer of de cron service actief is. Aangezien dit een commando is dat toegang tot de kernel nodig heeft, kunnen we dit niet als gewone gebruiker uitvoeren. We voeren het commando met verhoogde rechten uit door gebruik te maken van sudo (SuperUser do):
| Bash | |
|---|---|

Indien de service niet actief is, kan je deze activeren met:
| Bash | |
|---|---|
Nu de service actief is, kunnen we onze automatische taak toevoegen. Standaard heb je geen automatische toepassingen in crontab, dus zullen we eerst een nieuwe crontab aanmaken als volgt:
| Bash | |
|---|---|
Kies een editor, bijvoorbeeld nano. Deze zou moeten openen met nog lege tekst. Plaats de volgende tekst in het document: */1 * * * * date >> /home/osboxes/tijd.txt. Sla de wijzigingen op met "Ctrl + o" en vervolgens "Enter". Sluit de editor af met "Ctrl + x".
De syntax van crontab is als volgt:

Controleer daarna in de terminal of de inhoud correct is doorgegeven aan crontab als volgt:
| Bash | |
|---|---|
Als alles goed gaat, zal elke minuut de tijd geprint worden in het bestand /home/osboxes/tijd.txt. Door de >> wordt er steeds een nieuwe lijn toegevoegd aan dit bestand. Dit kan je controleren door de inhoud van het bestand continu te bekijken met het commando:
| Bash | |
|---|---|
Na een aantal minuten kan je het loggen van de tijd ongedaan maken door opnieuw crontab -e te gebruiken en de regel die je net hebt toegevoegd te verwijderen. Vergeet niet het document op te slaan na het verwijderen van de regel en controleer of je crontab opnieuw leeg is!
Proces stoppen¶
Voorlopig hebben we alleen processen grafisch stopgezet door het "kruisje" rechtsboven bij de applicatie te gebruiken. In een serveromgeving zal je als beheerder echter vaak geen GUI hebben, maar moeten processen toch kunnen worden stopgezet. Hiervoor gebruiken we het kill-commando. Open, indien je het al gesloten had, een nieuw proces gedit op de achtergrond via jouw terminal. Jouw terminal zal bij het opstarten automatisch het proces-id afdrukken. Dit id hebben we nodig om via het kill-commando het proces te stoppen.

Voer nu in de terminal het volgende commando uit waarbij je <procesid> vervangt door het proces-id van jouw tekstverwerker.
| Bash | |
|---|---|
Als alles goed gaat, zal gedit nu afgesloten zijn. Controleer dit via de commando's zoals eerder beschreven en via de "System Monitor". Soms kan het zijn dat een proces niet zomaar afgesloten kan worden. Je kan dit dan alsnog "forceren" door een extra vlag mee te geven aan het kill-commando als volgt:
| Bash | |
|---|---|
Open nu een nieuwe terminal en zoek het proces-id van het hoofdproces van jouw huidige sessie. Probeer dit af te sluiten.
Wat is het effect? Wat zou de reden kunnen zijn?
Om het hoofdproces terug te vinden gebruik je de uitvoer van het commando pstree. Het proces helemaal bovenaan aan is systemd. Hieraan hangen alle andere processen vast. Het id van dit proces kan je dan achterhalen via ps -aux en zal altijd 1 zijn.
We proberen om het proces systemd te sluiten:
| Bash | |
|---|---|
We krijgen error dat dit niet lukt omdat we geen rechten hebben, dus proberen via sudo:
| Bash | |
|---|---|
Nu krijgen we geen foutboodschap meer maar het proces werd toch niet afgesloten. Dit is logisch omdat we anders het volledig systeem zouden stopzetten met al zijn processen. Hiervoor dient een ander commando, namelijk:
Als variant op het stopzetten van een proces kan je het ook pauzeren. Dit doe je als volgt:
| Bash | |
|---|---|
Probeer nu jouw terminalproces 5 seconden te laten slapen. Je zal merken dat de terminal opnieuw bevroren is. Probeer daarna de terminal op de achtergrond te laten slapen.
Zorg ervoor dat je in de terminal in de map "Documents" zit. We zullen nu het script uitvoeren dat je tijdens de voorbereiding naar deze map hebt gedownload. Om zeker te zijn dat je in de juiste map zit, voer je het onderstaande commando uit:
| Bash | |
|---|---|
Voer daarna het onderstaande commando uit om het script te starten:
| Bash | |
|---|---|
Krijg je de fout 'unexpected end of file'?
Krijg je volgende fout: startloop.sh: line 2: syntax error: unexpected end of file? Dit komt omdat het script waarschijnlijk de line endings van Windows gebruikt. Dit kan je oplossen door het script te converteren naar Unix line endings.
Installeer hiervoor het programma dos2unix:
| Bash | |
|---|---|
Converteer het script naar Unix line endings:
Nadien zou je het script moeten kunnen uitvoeren.
Jouw terminal zal in een oneindige lus blijven hangen en elke seconde tekst produceren. Sluit het commando af op een manier naar keuze zonder de terminal af te sluiten. Als laatste sluit je jouw VM af door in de terminal het commando poweroff (of shutdown -h now) in te voeren. Dit zal alle processen afsluiten en jouw virtuele machine stopzetten.