i ett operativsystem finns det många program, som antingen kan köras av en användare eller av själva operativsystemet (t.ex. systemtjänster). Sådana program som körs på systemet kallas”processer”. Vanligtvis avslutas en process på egen hand när de är klara med sin uppgift, eller när du ber dem att sluta genom att trycka på en kortkommando eller klicka på ”Stäng” – knappen.
men ibland kan en process hänga upp eller konsumera mycket CPU eller RAM. I den här situationen vill du manuellt ”döda” processen. I den här artikeln kommer vi att titta på olika verktyg du kan använda för att döda processer på ett Linux-system.
lokalisera processen för att döda
för att döda en process bör du först hitta detaljerna i processen. Du kan göra detta genom tre kommandon – top
ps
pidof
och pgrep
. Beroende på situationen kan du använda ett av dessa kommandon för detta ändamål.
som vi kommer att se senare i den här artikeln kan du döda en process med dess namn eller dess process-ID (PID). PID är ett nummer som unikt identifierar en process. Att döda med process-ID är användbart när du bara vill döda en specifik process. Å andra sidan är dödande av processnamnet användbart när du vill döda alla löpande instanser av ett visst program.
lokalisera processen med toppkommandot
vi tittar först på kommandot top
. Brand upp det översta kommandot genom att skriva:
top
Du kommer att få ett interaktivt gränssnitt, som visas nedan. Du kan bläddra igenom den här listan för att hitta namnet eller PID för processen du vill döda.
för att bläddra igenom den här listan kan du använda upp / ner-tangenterna. Dessutom har toppkommandot också sätt att filtrera processer efter CPU-användning, användar-och processnamn, som du kan läsa om i den här guiden.
kolumnen längst till vänster innehåller processens PID och höger sida innehåller programnamnet. Som ett exempel, i ovanstående skärmdump har vi vnstatd
– processen som körs med ett process-ID på 263.
hitta processen med ps-och grep-kommandon
ett annat sätt att få en lista över processen är att köra:
ps aux
i ovanstående kommando har vi använt flaggorna aux
som har följande betydelser:
-
a
: Visa processer för alla användare -
u
: visa användaren som använder processen -
x
: visa alla processer. (Utan detta kommerps
inte att visa processer som körs i en GUI-miljö.)
utmatningen av kommandot liknar den för top
. PID är tillgängligt i andra kolumnen från vänster, och processnamnet är tillgängligt i kolumnen längst till höger.
fördelen med att användaps
är att du enkelt kan filtrera listan med kommandotgrep
. Till exempel, för att hitta en process som är associerad med termen ”vnstat” kan du använda:
ps aux | grep -i vnstat
Här har vi två resultat – vnstatd
– processen, liksomgrep
– processen. Eftersom vi letade efter alla instanser av termen ”vnstat”, och vi körde också grep
med ”vnstat” som argument, fick vi grep
också i resultaten.
således, även om det inte finns några ”vnstat” – relaterade processer som körs, skulle vi få en post som visar grep
process:
så även om vi fick ett resultat finns det inga processer som är av intresse för oss.
hitta PID med pidof och pgrep
kombinationentop
ochps
grep
gör att vi kan söka efter processer. Å andra sidan, om du vet det exakta namnet på en process, kan du använda pidof
för att hitta dess PID.
att använda pidof
är ganska enkelt. För att få PID för en process med det exakta namnet ”nginx”, använd:
pidof nginx
om det finns processer med det exakta namnet ”nginx” får du en lista med PID, som visas nedan. Om det inte finns någon, får du ingenting som utgången.
om du inte känner till det fullständiga namnet kan du använda pgrep
istället för pidof
. Som ett exempel, för att söka efter alla processer som innehåller ”ngin” någonstans i deras namn, kör:
pgrep ngin
detta kommer att matcha processer med det exakta namnet ”nginx”, liksom alla andra processer som matchar samma kriterier. För vårt system märker vi att vi får alla PID som tillhörde ”nginx” i ovanstående skärmdump.
kommandonapidof
ochpkill
ger dig mycket mindre information. Som vi kommer att se i nästa avsnitt finns det vissa omständigheter där du inte kan döda en process. Utgången från top
och ps
innehåller ytterligare information som hjälper dig att avgöra om du verkligen kan döda en process.
vilka processer kan du döda?
Nu när vi har hittat processen är det dags att döda den. Men innan vi lär oss hur man gör det finns det några saker du behöver veta.
Om du är en vanlig användare kan du döda dina egna processer, men inte de som tillhör andra användare. Både top
och ps
visar användaren under vilken en process körs. När det gäller top
innehåller den andra kolumnen användarnamnet. Med ps aux
innehåller den första kolumnen användarnamnet.
en rotanvändare kan dock döda alla processer. Du kan antingen lägga till sudo
innan något kommando kör det som root, eller få ett rotskal genom att skriva su
och sedan köra kommandot.
i Linux, när en process dödas, levereras en ”avslutande signal” till processen. Även om det finns många olika typer av signaler, handlar vi mest om ”sigterm” och ”sigkill” – signalerna. De har ett numeriskt värde på 15 respektive 9. Som standard använder alla processdödande kommandon ”SIGTERM”, vilket gör att programmet kan köra lite kod innan det går ut, vilket gör det möjligt att avsluta”graciöst”. Om du vill avsluta processen med våld kan du använda ”SIGKILL” istället.
Linuxkärnan upprätthåller viss information relaterad till tillståndet för en process. När en process avslutas måste kärnan hålla informationen runt, så att föräldraprocessen kan ta reda på om barnprocessen kunde slutföra sina uppgifter och om den avslutades på egen hand eller om den dödades. Tills föräldern har gjort det kommer dessa ”zombie” – processer att visas i listan över processer. Du kan inte döda en sådan process eftersom det bara är en post i listan över alla processer, och den har inte en faktisk process associerad med den.
när en process utför input / output-operationer (som att läsa från eller skriva till skivor) sägs det vara i ett tillstånd av ”avbrottsfri sömn”. Du kan inte döda en process medan den är i detta tillstånd.
Du kan se om en process är i ”zombie”(Z) eller ”avbrottsfri sömn”(D) tillstånd genom att titta på den 8: e kolumnen i top
ps
utgång.
döda en process
det finns olika kommandon som du kan använda för att döda en process — kill
killall
pkill
och top
. Vi börjar från det enklaste: kommandotkillall
.
döda processer med kommandot killall
kommandot killall
är ett av de enklaste sätten att döda en process. Om du vet det exakta namnet på en process, och du vet att det inte körs som en annan användare och det är inte i Z eller D stater, då kan du använda detta kommando direkt; det finns ingen anledning att manuellt lokalisera processen som vi beskrivit ovan.
som standard, till exempel för att döda en process som heter ”firefox”, kör:
killall firefox
för att tvinga döda processen med sigkill, kör:
killall -9 firefox
Du kan också använda -SIGKILL
istället för -9
.
Om du vill döda processer interaktivt kan du använda -i
så här:
killall -i firefox
om du vill döda en process som körs som en annan användare kan du använda sudo
:
sudo killall firefox
Du kan också döda en process som har körts under en viss tidsperiod med flaggorna -o
och -y
. Så om du vill döda en process som har körts i mer än 30 minuter, använd:
killall -o 30m <process-name>
om du vill döda en process som har körts i mindre än 30 minuter, använd:
killall -y 30m <process-name>
På samma sätt använder du följande förkortningar för respektive tidsenheter:
s | seconds |
m | minutes |
h | hours |
d | days |
w | weeks |
M | months |
y | years |
Killing processes with the pkill command
Sometimes, you only know part of a program’s name. Precis som pgrep
pkill
låter dig döda processer baserade på partiella matchningar. Om du till exempel vill döda alla processer som innehåller namnet apache
I namnet, kör:
pkill apache
om du vill använda en SIGKILL istället för en SIGTERM, använd:
pkill -9 apache
igen kan du också använda -SIGKILL
istället för -9
.
döda processer med kill-kommandot
att använda kill-kommandot är enkelt. När du har upptäckt PID för processen som du vill döda kan du avsluta den med kommandot kill
. Om du till exempel vill döda en process med en PID på 1234, använd följande kommando:
kill 1234
som vi nämnde tidigare är standard att använda en SIGTERM. För att använda en SIGKILL, använd -9
eller -SIGKILL
som vi har sett tidigare:
kill -9 1234
döda processer med toppkommandot
det är väldigt enkelt att döda processer med top
kommando. Sök först efter processen som du vill döda och notera PID. Tryck sedan på k
medan top körs (detta är skiftlägeskänsligt). Det kommer att uppmana dig att ange PID för processen som du vill döda.
När du har angett PID trycker du på enter. Nu kommer det att fråga vilken signal du vill använda för att döda processen. Om du vill använda SIGTERM(15) trycker du bara på enter eftersom det är standardsignalen. Om du vill använda SIGKILL(9) skriver du 9 och trycker på enter.
om du lämnar process-ID tomt och trycker på enter direkt, kommer det att avsluta den översta processen i listan. Du kan bläddra med piltangenterna och ändra processen du vill döda på detta sätt.
slutsats
i det här inlägget såg vi de olika sätten att döda processer i Linux. Att lära sig dessa kommandon är viktigt för korrekt systemadministration och hantering. Om du vill utforska fler av dessa kommandon, ta en titt på deras respektive mansidor.
om du gillade det här inlägget, dela det gärna med dig av det.