Vorige | Inhoud | Volgende
In de vorige les hebben we gekeken naar enkele implicaties van het feit dat Linux een multi-user besturingssysteem is. In deze les bekijken we de multitasking-karakteristiek van Linux, en hoe die wordt bestuurd met de opdrachtregelinterface.
Zoals bij elk multitasking-besturingssysteem, voert Linux meerdere, gelijktijdige processen uit. Nou, ze lijken gelijktijdig, in ieder geval. Eigenlijk kan een enkele processorkern maar één proces tegelijk uitvoeren, maar de Linuxkernel slaagt erin om elk proces zijn beurt te geven op de processor en elk lijkt op hetzelfde moment te draaien.
Er zijn verschillende commando’s die worden gebruikt om processen te controleren. Deze zijn:
-
ps
– een lijst maken van de processen die op het systeem draaien -
kill
– een signaal sturen naar een of meer processen (meestal om een proces te “doden”) -
jobs
– een alternatieve manier om uw eigen processen op te sommen -
bg
– een proces op de achtergrond zetten -
bg
. een proces op de achtergrond zetten -
fg
– een proces op de voorgrond zetten
Een praktisch voorbeeld
Hoewel het misschien lijkt dat dit onderwerp nogal obscuur is, kan het zeer praktisch zijn voor de gemiddelde gebruiker die meestal met de grafische gebruikersinterface werkt. Hoewel het misschien niet duidelijk is, kunnen de meeste (zo niet alle) grafische programma’s worden gestart vanaf de opdrachtregel. Hier volgt een voorbeeld: er is een klein programma dat met het X Window systeem wordt meegeleverd, xload genaamd, dat een grafiek weergeeft van de systeembelasting. We kunnen dit programma uitvoeren door het volgende te typen:
xload
Merk op dat het kleine xload
venster verschijnt en de systeembelastinggrafiek begint weer te geven. Op systemen waar xload
niet beschikbaar is, probeert u gedit
in plaats daarvan. Merk ook op dat de prompt niet opnieuw verschijnt nadat het programma is gestart. De commandoregel wacht tot het programma klaar is voordat de controle terugkeert. Als we het xload
venster sluiten, eindigt het xload programma en komt de prompt terug.
Een programma op de achtergrond
Nu, om het leven wat gemakkelijker te maken, gaan we het xload programma opnieuw starten, maar deze keer zetten we het op de achtergrond, zodat de prompt terugkomt. Om dit te doen, voeren we xload als volgt uit:
xload &
1223$In dit geval kwam de prompt terug omdat het proces op de achtergrond was gezet.
Stel je nu voor dat we vergeten zijn het “&” symbool te gebruiken om het programma op de achtergrond te zetten. Er is nog hoop. We kunnen Ctrl-z
typen en het proces zal worden opgeschort. We kunnen dit verifiëren door te zien dat het venster van het programma bevroren is. Het proces bestaat nog steeds, maar is inactief. Om het proces op de achtergrond te hervatten, typt u het commando bg
(kort voorbackground). Hier is een voorbeeld:
xload
+ Stopped xload$ bg
+ xload &Listing Running Processes
Nu we een proces op de achtergrond hebben, zou het handig zijn om een lijst weer te geven van de processen die we hebben gestart. Om dit te doen, kunnen we hetjobs
commando of het krachtigere ps commando gebruiken.
jobs
+ Running xload&$ ps
PID TTY TIME CMD1211 pts/4 00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00 ps$Killing a Process
Stel dat we een programma hebben dat niet meer reageert; hoe komen we er van af? We gebruiken het kill
commando, natuurlijk. Laten we dit eens uitproberen op xload
. Eerst moeten we het proces identificeren dat we willen doden. We kunnen jobs
of ps
gebruiken om dit te doen. Als we jobs gebruiken, krijgen we een job nummer terug. Met ps
krijgen we een proces id (PID). We zullen het bothways doen:
xload &
1292$ jobs
+ Lopend xload&$ kill %1
$ xload &
1293 Beëindigd xload$ ps
PID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00 xload1294 pts/5 00:00:00 ps$ kill 1293
+ Beëindigd xload$Een beetje meer over kill
Hoewel het kill
commando gebruikt wordt om processen te “doden”, is zijn echte doel om signalen naar processen te sturen. Meestal is het signaal bedoeld om het proces te vertellen dat het weg moet gaan, maar er is meer aan de hand dan dat. Programma’s (als ze goed geschreven zijn) luisteren naar signalen van het besturingssysteem en reageren daarop, meestal om een nette manier van beëindigen mogelijk te maken. Een tekstverwerker kan bijvoorbeeld luisteren naar een signaal dat aangeeft dat de gebruiker zich afmeldt, of dat de computer wordt afgesloten. Wanneer hij dit signaal ontvangt, zou hij het werk dat aan de gang is kunnen opslaan voordat hij afsluit. Het kill
commando kan een verscheidenheid aan signalen naar processen sturen. Door te typen:
kill -l
krijgt u een lijst van de signalen die het ondersteunt. Veel van deze signalen zijn nogal obscuur, maar een aantal zijn handig om te weten:
Signaal # | Naam | Beschrijving |
1 | SIGHUP | Hang het signaal op. Programma’s kunnen naar dit signaal luisteren en er naar handelen. Dit signaal wordt naar processen gestuurd die in een terminal lopen wanneer u de terminal sluit. |
2 | SIGINT | Interrupt signaal. Dit signaal wordt aan processen gegeven om ze te onderbreken. Programma’s kunnen dit signaal verwerken en er naar handelen. We kunnen dit signaal ook direct geven door Ctrl-c te typen in het terminal venster waar het programma draait. |
15 | SIGTERM | Beëindigingssignaal. Dit signaal wordt aan processen gegeven om ze te beëindigen. Ook hier kunnen programma’s dit signaal verwerken en er naar handelen. Dit is het standaard signaal dat door het kill commando wordt gestuurd als geen signaal is opgegeven. |
9 | SIGKILL | Kill signaal. Dit signaal veroorzaakt de onmiddellijke beëindiging van het proces door de Linux kernel. Programma’s kunnen niet luisteren naar dit signaal. |
Nemen we nu aan dat we een programma hebben dat hopeloos vastloopt en dat we er vanaf willen. Dit is wat we doen:
- Gebruik het
ps
-commando om het proces-id (PID) te achterhalen van het proces dat we willen beëindigen. - Gebruik een
kill
-commando voor dat PID. - Als het proces weigert te beëindigen (d.w.z.,
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
In het bovenstaande voorbeeld hebben we het ps
commando met de x optie gebruikt om een lijst te maken van al onze processen (zelfs die niet gestart zijn vanaf de huidige terminal). Bovendien hebben we de uitvoer van het ps commando in grep
gepijpt om alleen het programma waarin we geïnteresseerd zijn in een lijst te zetten. Vervolgens hebben we kill gebruikt om een SIGTERM signaal te geven aan het programma dat problemen geeft.In de praktijk is het gebruikelijker om het op de volgende manier te doen, omdat het standaard signaal dat kill
verstuurt SIGTERM is en kill ook het signaalnummer kan gebruiken in plaats van de signaalnaam:
kill 2931
Dan, als het proces niet wordt beëindigd, forceer het met het SIGKILL signaal:
kill -9 2931
That’s It!
Dit is het einde van de “Leer de Shell” serie lessen. In de volgende serie, “Shell Scripts Schrijven”, zullen we bekijken hoe we taken kunnen automatiseren met de shell.
Verder lezen
- Voor een meer diepgaande behandeling van het onderwerp, zie Hoofdstuk 10 in De Linux Command Line.
- 1963 Timesharing: A Solution to Computer Bottlenecks, een fascinerende YouTube-video van het Computer History Museum waarin het eerste timesharing-besturingssysteem wordt beschreven en hoe het werkt. Het is in principe dezelfde methode die door alle moderne computers wordt gebruikt.