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.