Hur man dödar processer från Linux-terminalen

By rik

Ibland kan det vara nödvändigt att avsluta en process för att lösa ett problem. Att ”döda” en process, som det kallas, innebär i praktiken att tvinga den att avsluta sin körning. Här beskrivs hur du går tillväga via kommandoraden i Linux eller macOS.

Vad är en process?

När du kör program som webbläsare, bakgrundsaktiviteter relaterade till din skrivbordsmiljö eller Linux-systemtjänster, så skapas processer.

Processer kan delas in i två huvudkategorier:

  • Förgrundsprocesser: Dessa initieras av en användare och kan köras direkt i terminalen eller som grafiska applikationer.
  • Bakgrundsprocesser: Dessa startar automatiskt utan direkt användarinteraktion. De förväntar sig ingen inmatning och visar inga resultat. Tjänster och demoner är exempel på bakgrundsprocesser.

Om man liknar förgrundsprocesser med teaterns skådespelare, kan bakgrundsprocesser ses som teamet ”bakom kulisserna”.

När processer inte fungerar som de ska kan de överbelasta processorn, ta upp onödigt mycket minne eller fastna i oändliga loopar. Grafiska applikationer kan sluta svara på klick och terminalapplikationer kan vägra att återgå till kommandotolken.

Att avsluta en process

Att ”döda” en process betyder alltså att tvinga den att sluta köra, vilket kan vara nödvändigt om den inte längre svarar.

Linux erbjuder kommandona kill, pkill och killall för detta ändamål. Dessa kommandon kan användas oavsett typ av process, vare sig det är en grafisk applikation, en kommandoradsprocess, förgrunds- eller bakgrundsprocess.

Använda kommandot kill

För att använda kommandot kill måste du veta processens ID (PID). Du kan ta reda på PID med hjälp av kommandot ps.

För att visa alla processer, använd ps -e. Det genererar ofta en stor mängd information, så det kan vara bra att använda less för att bläddra i utskriften. Skriv: ps -e | less och tryck Enter.

ps -e | less

Detta visar en lista över processer. Du kan söka framåt i less med tangenten / och bakåt med ?.

För att hitta den process du söker, kan du skicka utskriften från ps till grep och ange namnet, eller delar av namnet, på processen. Till exempel:

ps -e | grep shutter

När du har hittat PID:t för den process du vill avsluta skickar du det till kill-kommandot som en parameter. För att avsluta processen med PID 2099, använder du kommandot:

kill 2099

Observera att kommandot kill inte ger någon bekräftelse om det lyckades.

Använda kommandot pkill

Med kommandot pkill kan du döda processer baserat på namn, utan att behöva veta PID. Du anger en sökterm som pkill använder för att matcha mot listan över aktiva processer. Alla processer som matchar stängs av. Det är därför viktigt att vara säker på att söktermen är korrekt.

För att vara extra försiktig, kan du använda pgrep innan pkill. pgrep tar också en sökterm och listar PID:n för alla matchande processer. Eftersom pgrep inte skickar någon ”döda”-signal, är det säkert att använda för att kontrollera söktermen. Både pkill och pgrep hanterar söktermer på samma sätt, och de har till och med samma manualsida.

Anta att det finns en process som innehåller ”subq” i namnet. Vi använder ps -u dave | grep subq för att se vilken process det är.

ps -u dave | grep subq

Om vi inte känner till det exakta namnet, men bara vet att ”subq” är en del av det, kan vi använda pgrep för att verifiera att bara en process matchar, och därefter pkill med samma sökterm.

pgrep subq
pkill subq

Du kan använda pkill för att avsluta flera processer samtidigt. I exemplet nedan används pgrep för att visa hur många Chrome-processer som körs, och sedan pkill för att döda alla. Slutligen verifieras med pgrep att alla har stängts ned.

pgrep chrome
pkill chrome
pgrep chrome

Om det finns flera processer med samma namn, men du inte vill stänga alla, kan du använda pgrep -f (kommandorad) för att identifiera skillnader. Ett exempel är två ping-processer, där du bara vill stänga av en av dem. Du kan använda deras kommandorader för att skilja dem åt. Använd citationstecken för att omsluta kommandoradsparametern.

pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"

Använda kommandot killall

Varning: I operativsystemen Solaris och OpenIndiana kan killall döda alla processer som tillhör dig. Om du är root eller använder sudo killall kan det leda till att din dator startas om. Det här beteendet bekräftades med den senaste versionen av OpenIndiana Hipster 2018.10.

Kommandot killall fungerar på liknande sätt som pkill, men med en viktig skillnad. Istället för att skicka en sökterm måste du ange det exakta processnamnet.

Du kan inte ange en partiell matchning, utan måste ange hela processens namn. Till exempel:

killall shutt
killall shutter

Med alternativet -y (yngre än) kan du döda processer som har körts under en viss tidsperiod. Perioden anges i siffror följt av en enhet:

s (sekunder)
m (minuter)
h (timmar)
d (dagar)
w (veckor)
M (månader, versalt M)
y (år)

För att stänga av en process med namnet ”ana” som precis har startat, men lämna äldre instanser igång (om du agerar inom två minuter), använder du följande:

killall -y 2m ana

Alternativet -o (äldre än) stänger av processer som har körts längre än en viss period. Följande kommando stänger av alla SSH-anslutningar som har varit aktiva i mer än en dag:

killall -o 1d sshd

Var försiktig

Dessa kommandon ger dig möjlighet att identifiera och stänga av felaktiga processer på ett kontrollerat sätt.

Var alltid försiktig. Först, se till att processen du ska stänga verkligen är den du vill. Dubbelkolla och se till att det är rätt process. Gå vidare med att stänga av processen först när du är säker.