Boolean World

linux kill cover image

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 – toppspidof 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.

det översta kommandot som visar en lista över processer.

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 kommer ps 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.

resultaten av kommandot "ps aux"."ps aux" command.

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

filtreringsprocesser med ps och grep, med ett positivt resultat.

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:

filtreringsprocesser med ps och grep.

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 ochpsgrep 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.

kommandot pidof

om du inte känner till det fullständiga namnet kan du använda pgrepistä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.

kommandot pgrep.

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 topps utgång.

döda en process

det finns olika kommandon som du kan använda för att döda en process — killkillallpkill 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 pgreppkill 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.

Lämna ett svar

Din e-postadress kommer inte publiceras.