Lijkt je systeem af en toe vast te lopen, doordat één applicatie met bijna alle resources aan de haal gaat?En reageert je desktopomgeving zó traag dat je niets anders kan doen dan wachten tot die applicatie zich beter gedraagt? Switch dan naar een virtuele terminal met Alt-Ctrl-F1 en gebruik onderstaande commando’s om het probleem op te lossen!

1. PID

Elk proces op je systeem wordt geïdentificeerd door een uniek proces ID of PID. Dat vind je in de tweede kolom van ps’ output, bijvoorbeeld:

 

$ ps -fu filip | grep icedove

filip     4031  3778  0 09:03 ?        00:01:16 icedove

 

Merk op dat we hier voor alle veiligheid enkel zoeken op processen van de gebruiker filip. Ben je de enige gebruiker van je systeem, gebruik dan het commando ‘ps -ef’ om alle processen te tonen.

 2. pgrep

Uit het voorbeeld van tip 1 hebben we eigenlijk enkel de PID-informatie nodig. Het commando pgrep geeft precies die informatie:

$ pgrep -u filip icedove

4031

Standaard doorzoekt pgrep enkel de procesnamen. Wil je ook de argumenten van de processen doorzoeken, voeg dan de -f-optie toe (zie afbeelding 1).

 

3. renice

Processen krijgen een prioriteit tussen -20 (hoogste prioriteit) en 19 (laagste prioriteit): de meeste processen hebben prioriteit 0. Wil je minder resources geven aan een bepaald proces? Verlaag dan de prioriteit met het renice-commando:

 

$ renice -n +10 $(pgrep icedove)

4031 (process ID) old priority 0, new priority 10

Let wel op dat enkel de root-gebruiker de prioriteit van het proces daarna weer kan verhogen!

 4. cpulimit

Met renice geef je aan dat een bepaald proces minder belangrijk is, maar de kernel beslist nog steeds hoeveel resources dat proces krijgt. Wil je zelf meer controle hebben? Met cpulimit (beschikbaar via het gelijknamige pakket) stel je paal en perk aan het cpu-gebruik van overijverige processen. Mag Icedove maar 50% van de beschikbare processorkracht gebruiken? Dat is zo geregeld:

$ cpulimit -e icedove -l 50

Process 4031 detected

In plaats van de procesnaam kun je trouwens ook het PID meegeven met cpulimit (-p-optie).

Bij systemen met meerdere cores telt elke core als 100% en hyperthreading verdubbelt het aantal logische cores. Op een quad-core met hyperthreading heb je dus 800% cpu-gebruik beschikbaar.

 

5. Signalen

Intussen is ons systeem al flink wat sneller geworden, doordat de problematische applicatie niet meer alle resources opeist. Maar de kans is wel groot dat het programma zelf nog steeds niet reageert en ook niet meer netjes via de menubalk kan worden afgesloten. Gelukkig zijn er andere manieren om duidelijk te maken dat we het programma willen stoppen, namelijk met het kill-commando. Kill ondersteunt een hele reeks signalen, al wordt het meestal gebruikt om een proces op hardhandige wijze te stoppen. kill -l toont het nummer en de naam van alle beschikbare signalen, maar onthoudt vooral de volgende:

– 2 of SIGINT: dit is het equivalent van een (commandline) applicatie onderbreken met Ctrl-C. De meeste programma’s reageren hierop door zich netjes af te breken (niet-bewaarde data op schijf wegschrijven, tijdelijke bestanden verwijderen, subprocessen stoppen, enz.).

– 15 of SIGTERM: vergelijkbaar met SIGINT. Dit is het standaardsignaal voor kill als je geen specifiek signaal opgeeft.

– 9 of SIGKILL: het proces moet onmiddellijk stoppen, zonder speciale afsluitroutines. Dit leidt mogelijk tot dataverlies of -corruptie.

 

6. (p)kill

Om een proces af te sluiten, verstuur je eerst en vooral een SIGINT- of SIGTERM-signaal. Je geeft het gewenste signaal met nummer of naam mee als optie bij kill:

 

$ kill -2 4031

$ kill -TERM 4031

Helaas kunnen applicaties ervoor kiezen om die signalen te negeren: ze bieden dus geen garantie op succes. Ook als de applicatie gecrasht is, zal het niet meer reageren op die signalen. De enige oplossing is dan het SIGKILL-signaal te versturen, dat onmogelijk genegeerd kan worden. Bijvoorbeeld:

$ kill -9 4031

Voor het kill-commando heb je het PID van het proces nodig. Je zou dit kunnen combineren met pgrep uit tip 2:

$ kill -9 $(pgref icedove)

Maar het kan nóg eenvoudiger met pkill:

$ pkill -9 icedove

pkill werkt net zoals pgrep (ook de commandline-opties zijn identiek), maar verstuurt meteen het gekozen signaal naar het proces in plaats van het PID te tonen.

 Is het probleem met deze tips opgelost? Dan kun je terug naar je desktop gaan via Alt-Ctrl-F7!