Job Control

Home |

Föregående | Innehåll | Nästa

I föregående lektion tittade vi på några av konsekvenserna av att Linux är ett fleranvändaroperativsystem. I den här lektionen kommer vi att undersöka Linux multitaskingnatur och hur den styrs med kommandoradsgränssnittet.

Som med alla multitaskingoperativsystem utför Linux flera, samtidiga processer. De verkar i alla fall vara samtidiga. Egentligen kan en enda processorkärna bara köra en process åt gången, men Linuxkärnan lyckas ge varje process sin tur vid processorn och alla verkar köra samtidigt.

Det finns flera kommandon som används för att styra processer. De är följande:

  • ps – listar de processer som körs i systemet
  • kill – skickar en signal till en eller flera processer (vanligtvis för att ”döda” en process)
  • jobs – ett alternativt sätt att lista sina egna processer
  • bg – – en annan form av kontroll av processer. sätta en process i bakgrunden
  • fg – sätta en process i förgrunden

Ett praktiskt exempel

Och även om det kan tyckas att detta ämne är ganska oklart, kan det vara mycket praktiskt för den genomsnittlige användaren som mestadels arbetar med det grafiska användargränssnittet. Även om det kanske inte är uppenbart kan de flesta (om inte alla) grafiska program startas från kommandoraden. Här är ett exempel: det finns ett litet program som levereras med X Window-systemet och som heter xload och som visar en graf som representerar systembelastningen. Vi kan köra detta program genom att skriva följande:

$ xload

Se att det lilla xload-fönstret visas och börjar visa grafen för systembelastning. På system där xload inte är tillgängligt kan du försöka med gedit i stället. Lägg också märke till att vår prompt inte återkom efter att programmet startat. Skalet väntar på att programmet ska avslutas innan kontrollen återgår. Om vi stänger xload-fönstret avslutas xload-programmet och prompten återkommer.

Placera ett program i bakgrunden

Nu, för att göra livet lite enklare, kommer vi att starta xload-programmet igen, men den här gången kommer vi att placera det i bakgrunden så att prompten återkommer. För att göra detta kör vi xload på följande sätt:

$ xload & 1223$

I det här fallet återkom prompten eftersom processen sattes i bakgrunden.

Föreställ dig nu att vi glömde att använda symbolen ”&” för att sätta programmet i bakgrunden. Det finns fortfarande hopp. Vi kan skriva Ctrl-z och processen kommer att avbrytas. Vi kan verifiera detta genom att se att programmets fönster är fruset. Processen existerar fortfarande, men är inaktiv. För att återuppta processen i bakgrunden skriver vi kommandot bg (förkortning förbackground). Här är ett exempel:

$ xload+ Stopped xload$ bg+ xload &

Lista över pågående processer

Nu när vi har en process i bakgrunden skulle det vara bra att visa en lista över de processer vi har startat. För att göra detta kan vi använda antingen kommandotjobs eller det mer kraftfulla kommandot ps.

$ jobs+ Running xload&$ psPID TTY TIME CMD1211 pts/4 00:00:00:00 bash1246 pts/4 00:00:00:00 xload1247 pts/4 00:00:00:00 ps$

Döda en process

Antag att vi har ett program som inte längre svarar, hur blir vi av med det? Vi använder naturligtvis kommandot kill. Låt oss prova detta på xload. Först måste vi identifiera den process vi vill döda. Vi kan använda antingen jobs eller ps för att göra detta. Om vi använder jobs får vi tillbaka ett jobbnummer. Med ps får vi ett processid (PID). Vi gör det bådeways:

$ xload & 1292$ jobs+ Running xload&$ kill %1$ xload & 1293 Terminated xload$ psPID TTY TIME CMD1280 pts/5 00:00:00:00 bash1293 pts/5 00:00:00:00 xload1294 pts/5 00:00:00 ps$ kill 1293+ Avslutat xload$

Var lite mer om kill

Och kommandot kill används för att ”döda” processer, men dess egentliga syfte är att skicka signaler till processer. För det mesta är signalen avsedd att tala om för processen att försvinna, men det finns mer än så. Program (om de är korrekt skrivna) lyssnar på signaler från operativsystemet och svarar på dem, oftast för att möjliggöra någon graciös metod för att avsluta. En textredigerare kan till exempel lyssna på signaler som indikerar att användaren loggar ut eller att datorn stängs ner. När den får denna signal kan den spara det pågående arbetet innan den avslutas. Kommandot kill kan skicka en mängd olika signaler till processer. Genom att skriva:

kill -l

skrivs en lista över de signaler som stöds. Många är ganska obskyra, men flera är praktiska att känna till:

Signal # Namn Beskrivning
1 SIGHUP Häng upp signal. Programmen kan lyssna efter denna signal och agera på den. Den här signalen skickas till processer som körs i en terminal när du stänger terminalen.
2 SIGINT Avbrottssignal. Denna signal ges till processer för att avbryta dem. Programmen kan bearbeta denna signal och agera på den. Vi kan också utfärda denna signal direkt genom att skriva Ctrl-c i terminalfönstret där programmet körs.
15 SIGTERM Avslutningssignal. Denna signal ges till processer för att avsluta dem. Återigen kan program bearbeta denna signal och agera på den. Detta är den standardsignal som skickas av kommandot kill om ingen signal anges.
9 SIGKILL Avsluta-signal. Denna signal medför att processen omedelbart avslutas av Linuxkärnan. Program kan inte lyssna på denna signal.

Nu antar vi att vi har ett program som är hopplöst hängande och vi vill bli av med det. Så här gör vi:

  1. Använd kommandot ps för att få fram process-id (PID) för den process vi vill avsluta.
  2. Sänd ett kill-kommando för det PID:
  3. Om processen vägrar att avslutas (dvs, den ignorerar signalen), skicka allt hårdare signaler tills den avslutas.
$ ps x | grep bad_programPID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931$ kill -SIGKILL 2931

I exemplet ovan använde vi ps-kommandot med x-alternativet för att lista alla våra processer (även de som inte startats från den aktuella terminalen). Dessutom har vi överfört utdata från ps-kommandot till grep för att endast lista det program som vi är intresserade av. Därefter använde vi kill för att skicka en SIGTERM-signal till det besvärliga programmet.I praktiken är det vanligare att göra det på följande sätt eftersom standardsignalen som skickas av kill är SIGTERM och kill också kan använda signalnumret i stället för signalnamnet:

$ kill 2931

Sedan, om processen inte avslutas, tvinga den med signalen SIGKILL:

$ kill -9 2931

Det var allt!

Detta avslutar lektionsserien ”Learning the Shell”. I nästa serie, ”Writing Shell Scripts”, kommer vi att titta på hur man automatiserar uppgifter med theshell.

Fördjupad läsning

  • För en mer djupgående behandling av ämnet, se kapitel 10 i The Linux Command Line.
  • 1963 Timesharing: A Solution to Computer Bottlenecks, en fascinerande YouTube-video från Computer History Museum som beskriver det första operativsystemet för tidsdelning och hur det fungerar. Det är i princip samma metod som används av alla moderna datorer.
Top | Previous | Contents | Next

Lämna ett svar

Din e-postadress kommer inte publiceras.