Forrige | Indhold | Næste
I den foregående lektion kiggede vi på nogle af konsekvenserne af, at Linux er et flerbrugerstyresystem. I denne lektion vil vi undersøge Linux’ multitaskingnatur, og hvordan den styres med kommandolinjeinterfacet.
Som med ethvert multitasking-operativsystem udfører Linux flere, samtidige processer. De ser i hvert fald ud til at være samtidige. Faktisk kan en enkelt processorkerne kun udføre én proces ad gangen, men Linuxkernel formår at give hver proces sin tur ved processoren, og hver proces ser ud til at køre på samme tid.
Der er flere kommandoer, der bruges til at styre processer. De er:
-
ps
– liste over de processer, der kører på systemet -
kill
– sende et signal til en eller flere processer (normalt for at “dræbe” en proces) -
jobs
– en alternativ måde at liste sine egne processer på -
bg
– – en anden måde at liste sine egne processer på -
bg
. sætte en proces i baggrunden -
fg
– sætte en proces i forgrunden
Et praktisk eksempel
Mens det kan virke som om, at dette emne er ret obskurt, kan det være meget praktisk for den gennemsnitlige bruger, som for det meste arbejder med den grafiske brugergrænseflade. Selv om det måske ikke er tydeligt, kan de fleste (hvis ikke alle) grafiske programmer startes fra kommandolinjen. Her er et eksempel: Der er et lille program, der leveres med X Window-systemet, kaldet xload, som viser en graf, der repræsenterer systembelastningen. Vi kan starte dette program ved at skrive følgende:
xload
xload
Bemærk, at det lille xload
vindue vises og begynder at vise grafen for systembelastning. På systemer, hvor xload
ikke er tilgængelig, skal du prøve gedit
i stedet. Bemærk også, at vores prompt ikke dukkede op igen, efter at programmet blev startet. Shell’en venter på, at programmet er færdigt, før kontrollen vender tilbage. Hvis vi lukker xload
-vinduet, afsluttes xload-programmet, og prompten vender tilbage.
Sætte et program i baggrunden
Nu vil vi, for at gøre livet lidt lettere, starte xload-programmet igen, men denne gang vil vi sætte det i baggrunden, så prompten vender tilbage. For at gøre dette udfører vi xload på følgende måde:
xload &
1223$I dette tilfælde kom prompten tilbage, fordi processen blev sat i baggrunden.
Forestil dig nu, at vi har glemt at bruge symbolet “&” for at sætte programmet i baggrunden. Der er stadig håb. Vi kan skrive Ctrl-z
, og processen vil blive suspenderet. Vi kan bekræfte dette ved at se, at programmets vindue er frosset. Processen eksisterer stadig, men den er inaktiv. For at genoptage processen i baggrunden skal du skrive kommandoen bg
(en forkortelse forbackground). Her er et eksempel:
xload
+ Stopped xload$ bg
+ xload &Liste over kørende processer
Nu, hvor vi har en proces i baggrunden, ville det være nyttigt at viseen liste over de processer, vi har startet. For at gøre dette kan vi bruge enten kommandoenjobs
eller den mere kraftfulde ps-kommando.
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$Killing a Process
Sæt, at vi har et program, der ikke længere reagerer; hvordan kommer vi af med det? Vi bruger selvfølgelig kommandoen kill
. Lad os afprøve dette på xload
. Først skal vi identificere den proces, som vi ønsker at dræbe. Vi kan bruge enten jobs
eller ps
til at gøre dette. Hvis vi bruger jobs, vil vi få et jobnummer tilbage. Med ps
får vi et process id (PID). Vi vil gøre 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
+ Afsluttet xload$En smule mere om kill
Mens kommandoen kill
bruges til at “dræbe” processer, er dens egentlige formål at sende signaler til processer. Det meste af tiden er signalet beregnet til at fortælle processen, at den skal forsvinde, men der er mere i det end det. Programmer (hvis de er korrekt skrevet) lytter efter signaler fra operativsystemet og reagerer på dem, oftest for at give mulighed for en eller anden elegant metode til at afslutte processen. F.eks. kan en teksteditor lytte efter ethvert signal, der angiver, at brugeren logger af, eller at computeren lukker ned. Når den modtager dette signal, kan den gemme det igangværende arbejde, før den afsluttes. Kommandoen kill
kan sende en række forskellige signaler til processer. Hvis du skriver:
kill -l
, får du en liste over de signaler, som den understøtter. Mange er ret obskure,men flere er praktiske at kende:
Signal # | Navn | Beskrivelse |
1 | SIGHUP | Hæng op-signal. Programmer kan lytte efter dette signal og reagere på det. Dette signal sendes til processer, der kører i en terminal, når du lukker terminalen. |
2 | SIGINT | Afbrydelsessignal. Dette signal gives til processer for at afbryde dem. Programmer kan behandle dette signal og handle på det. Vi kan også udstede dette signal direkte ved at skrive Ctrl-c i det terminalvindue, hvor programmet kører. |
15 | SIGTERM | Afslutningssignal. Dette signal gives til processer for at afslutte dem. Igen kan programmer behandle dette signal og handle på det. Dette er det standardsignal, der sendes af kommandoen kill , hvis der ikke er angivet noget signal. |
9 | SIGKILL | Afslutningssignal. Dette signal medfører, at processen straks afsluttes af Linux-kernen. Programmer kan ikke lytte efter dette signal. |
Nu lad os antage, at vi har et program, der er håbløst hængende, og vi ønsker at slippe af med det. Her er, hvad vi gør:
- Brug kommandoen
ps
til at få proces-id’et (PID) for den proces, vi ønsker at afslutte. - Sæt en
kill
-kommando for dette PID. - Hvis processen nægter at afslutte (dvs, den ignorerer signalet), så send stadig hårdere signaler, indtil den afsluttes.
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
I eksemplet ovenfor brugte vi kommandoen ps
med x-indstillingen til at liste alle vores processer (også dem, der ikke er startet fra den aktuelle terminal). Desuden har vi ledt output fra ps-kommandoen ind i grep
for kun at liste det program, som vi er interesseret i. Dernæst brugte vi kill til at udsende et SIGTERM-signal til det problematiske program.I praksis er det mere almindeligt at gøre det på følgende måde, da det standardsignal, der sendes af kill
, er SIGTERM, og kill kan også bruge signalnummeret i stedet for signalnavnet:
kill 2931
Dernæst, hvis processen ikke afsluttes, tvinges den med SIGKILL-signalet:
kill -9 2931
Det er det!
Dette er afslutningen på lektionsserien “Learning the Shell”. I den næste serie, “Skrivning af Shell-scripts”, vil vi se på, hvordan man automatiserer opgaver med theshell.
Videre læsning
- For en mere dybdegående behandling af emnet kan du se kapitel 10 i The Linux Command Line.
- 1963 Timesharing: A Solution to Computer Bottlenecks, en fascinerende YouTube-video fra Computer History Museum, der beskriver det første timesharing-operativsystem, og hvordan det fungerer. Det er grundlæggende den samme metode, som bruges af alle moderne computere.