web analytics

Kill’em, kill’em all

Print Friendly, PDF & Email

Laat mij eens raden. Jullie hebben die ervaring ook al. Een foutje in een programma en hatsikidee… je krijgt het langs geen kanten nog van je scherm weg. Met veel geluk kan je het minimizen tot dat je je PC herstart.

In mijn geval, als ik daarover een posting wil schrijven, moet ik natuurlijk geluk hebben dat ik een stukje software hebt dat dwars gaat liggen. Gelukkig heb er ik zo’n eentje: Pinta, een kleine grafische editor op mijn Ubuntu 1404. Dat is ook de reden dat er screenshots van mijn Linux Mint box samen met mijn Ubuntu 1404 laptop getoond worden.

Wat is nu het probleem met Pinta? Wel, steeds als ik die wil afsluiten, toont ie me zijn middenvinger en blijft ie halsstarrig draaien en denkt me te kunnen paaien met een – OMG… het lijkt wel een Windows-achtig bericht .. al die duidelijke informatie 👿

2014-08-15-Selectie_006
en op ‘Details’ klikken maakt me niks de wijzer  😯
2014-08-15-Pinta_007
Daar Pinta letterlijk van geen wijken wil weten (via menu, rechter muis-klik, knopje op de titelbalk, …) moet ik het nu wel hardhandig aanpakken.

Ten strijde

Ik open een Terminal en treed in de arena gewapend met de ps opdracht.
ps staat voor process status. Alles dat draait binnen Linux is een proces, en dus kunnen we daar de toestand van opvragen.

Nou, wat draait er zo allemaal op mijn Linux Mint box momenteel. Ik probeer de opdracht ps in een terminal.
ps_018
Hmmm, veel is dat niet. Wellicht moet ik enkele opties erbij voegen.

Zoals bij alle Linux opdrachten moet ik de man-pages raadplegen om alle opties, switches en parameters te zien, welke ik dan kan toepassen op de ps opdracht. Wat ik nodig heb zijn:

  • -a : select all with a tty except session leaders
  • u : display user-oriented format
  • x : select processes without controlling ttys

Dan ziet de opdracht er als volgt uit:

$ ps -aux

wat het volgend resultaat geeft:
ps-aux_018
Dat is al wat beter.
Van links naar rechts staan de volgende kolommen:
USER – PID – %CPU – %MEM – VSZ – RSS – TTY – STAT – TIME – COMMAND

  • USER = user owning the process
  • PID = process ID of the process
  • %CPU = It is the CPU time used divided by the time the process has been running.
  • %MEM = ratio of the process’s resident set size to the physical memory on the machine
  • VSZ = virtual memory usage of entire process
  • RSS = resident set size, the non-swapped physical memory that a task has used
  • TTY = controlling tty (terminal)
  • STAT = multi-character process state
  • START = starting time or date of the process
  • TIME = cumulative CPU time
  • COMMAND = command with all its arguments

Output filteren

Als je in zo’n ellenlange lijst één specifiek proces moet weten te vinden, dan ben je wel een eindje zoet. Daarom ga ik de hulp inroepen van een heel krachtige Linux opdracht: grep.

De naam komt van de ed (Line Editor) opdrachten g/re/p die samen staan voor globally search a regular expression and print), en die precies hetzelfde doen als grep: een globale zoekopdracht met een reguliere uitdrukking en alle ‘hits’ printen.

Grep is één van meest performante opdrachten op het gebied van zoeken in Linux. Over reguliere uitdrukkingen (regular expressions – regex) zijn tonnen artikels geschreven.
Wat ik wil is feitelijk simpel. Ik ga de output van ps -aux pipen (via het pipe character | ) naar grep en deze de opdracht geven om enkel die lijnen te outputten die voldoen aan de reguliere uitdrukking pinta, daar ik natuurlijk enkel geïnteresseerd ben in processen met betrekking tot dat programma.

A pipe is a form of redirection that is used in Linux and other Unix-like operating systems to send the output of one program to another program for further processing.

De opdracht wordt dan:

$ ps -aux | grep pinta

Wat zal er gebeuren?
ps zal rekening houden met de parameters en een hele lijst van processen outputten. Maar wij krijgen ze (nog) niet te zien, daar het pipe-teken ervoor zorgt dat de ps-output doorgestuurd wordt als input naar grep die zijn ding zal doen en ons enkel die lijnen zal tonen waar er ergens het woord pinta in voorkomt.

Dat geeft ons het volgende resultaat:

2014-08-15-Terminal_008
Is het jullie opgevallen dat pinta een exe-bestand is, dat draait middels mono, de Microsoft dotnet kloon. Ik denk dat ik die mono brol maar zal verwijderen.

Target identified – proceed to kill

kill is ook zo’n speciale opdracht voor een Linux gebruiker. Daarmee ga je zonder pardon een proces beëindigen

The kill command will kill a process using the kill signal and PID given by the user.

Wat was de PID ons pinda programma al weer? juist ja.
Pinta heeft nu lang genoeg met mijn voeten gespeeld. Het wordt tijd om dat proces te elimineren van mijn systeem.

kill -9 9576

Euh, wat doet die -9 daar nu tussen?

De parameter -s bij de kill opdracht staat voor ‘signal number‘.  Met het signal number van 9 (KILL), kan de kill-opdracht niet vastlopen in het proces; gebruik dit om een proces te kill(en) dat een gewone kill-opdracht niet kan beëindigen.
Het gebruik van de -9 is nu de facto quasi een standaard parameter geworden bij de kill-opdrachten.

Ik moet geen sudo gebruiken, daar ik de USER ben. Is root de eigenaar van het proces, dan moet je wel sudo gebruiken.

Zoals verwacht doet kill wat er verwacht wordt en verdwijnt het hangende Pinta scherm van mijn bureaublad en komt er terug geheugen vrij.

Killall: zijn vriendje

Bij de opdracht kill werd de PID meegeven, maar wat als je tientallen ‘hits’ hebt voor je zoeksleutel. Bij wijze van voorbeeld heb ik enkele extra terminals geopend in Linux Mint. ps-bash

De ps uitdraai toont me een totaal van 5 bash-terminals. Ik zou natuurlijk het volgende kunnen ingeven:

$ kill -9 2533 4283 7918 7948 7978

Meestal wordt in die situaties gebruik gemaakt van de opdracht killall.

killall – kill processes by name

Dat laat ons toe om die tientallen processen in één klap uit ons systeem te gooien.

Met de opdracht

$ killall bash

worden al die bash processen verwijderd. Je kan Linux ook niet zo gemakkelijk misleiden. De terminal waar ik het commando ingaf heeft zichzelf blijkbaar niet vernietigd.

ps-bash-1
Hierboven zie je nog enkele extra commando’s. Na de killall bleef mijn terminal gewoon verder werken en er bleken nog twee processen te lopen met ‘bash’ in de procesnaam. Maar welke is nu feitelijk deze van mijn terminal?
Daartoe kun je de $$ opdracht ingeven. Deze geeft me 4283 terug.
Of je kan gewoon de ps opdracht gebruiken, die de PID van 4283 geeft.

Wat als ik nu expliciet kill 4283 zou ingeven? Wel, als je dat doet gebeurt er…niks. Geen foutmelding, niks, nada, …

Nog geen zo’n rare vogels die Linux mannen. Wie zaagt er nu de tak af waar ie op zit.

Maar wat met dat ander proces? PID 8322. Waarom blijft ie leven?
killall
Via kill 8322 is het proces wel verwijderd, maar er is direct een nieuwe met PID 10004 aangemaakt. Blijkbaar draait er een proces dat een onderliggende bash nodig heeft.

En als mijn ganse desktop bevroren is door dat ene nukkige programma.

De terminals die wij draaien, zijn afhankelijk van het goed functioneren van je grafisch bureaublad. Als dat bureaublad door een probleem hangt, dan is je terminal ook niet meer te gebruiken. Maar is er nog een oplossing.
Door gebruikt te maken van de [Ctr][Alt]-[Fn] toetsen verlaat je je huidige sessie en start je een andere niet-grafisch en full-screen sessie op. Nu kan je niet anders dan alles via de commando-regel doen.
Je moet wel inloggen met je naam en wachtwoord, maar dan kun je gewoon dezelfde opdrachten geven om het storende programma te verwijderen.

Via [Ctrl][Alt]-F8 voor Linux Mint  of [Ctrl][Alt]-F7 voor Ubuntu kom je terug naar je grafische interface, waar alles terug de peis en de vree zou moeten zijn.

Beoordeling

Geef een reactie

%d bloggers liken dit: