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&$ ps
PID 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$ ps
PID 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:
- Använd kommandot
ps
för att få fram process-id (PID) för den process vi vill avsluta. - Sänd ett
kill
-kommando för det PID: - Om processen vägrar att avslutas (dvs, den ignorerar signalen), skicka allt hårdare signaler tills den avslutas.
ps x | grep bad_program
PID 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.