Commandline Tips
- February 6, 2015
- 0
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!