Med hjälp av skalet kan man få flera kommandon utförda samtidigt. Man kan också avbryta kommandon, eller tillfälligt stoppa dem för att låta dem fortsätta vid ett senare tillfälle. I det här avsnittet ska vi berätta hur det går till.
Antag att vi kör ett kommando
som tar lång tid och blir otåliga
medan vi sitter och väntar på att prompten ska
återvända. När vi tröttnat på att vänta kan vi
trycka C-c. Då gripet skalet in och avbryter kommandot,
och prompten återvänder omedelbart.$ cp /usr/bin/emacs .
$ ls -l emacs
-rwxrwxr-x 1 göran göran 1814268 feb 5 14:19 emacs*
$ gzip -9 emacs Efter en stund trycker jag C-c...
$ ls -l emacs
-rwxrwxr-x 1 göran göran 1814268 feb 5 14:19 emacs*
$Vad var det som hände ovan? Jo, först kopierade jag en stor
fil, den som innehåller programmet Emacs, till den nuvarande katalogen.
Sedan startade jag ett kommando, gzip emacs, som komprimerar filen.
Efter ett antal sekunder hade prompten fortfarande inte
återvänt, och då tryckte jag C-c.
Därigenom avbröt jag kommandot, och filen emacs
blev inte komprimerad. (Asterisken som ls skriver ut efter filnamnet
emacs markerar att filen är exekverbar.)
Metoden att avbrya ett kommando med C-c är destruktiv;
den del av arbetet som kommandot redan gjort är förgäves.
Ett annat och bättre sätt att slippa vänta på prompten
medan ett kommando är igång, är att låta kommandot
köra i bakgrunden. Detta innebär att kommandot
undviker att blockera det skal man arbetar vid.
Medan körningen av kommandot pågår kan man då ge
nya kommandon.
För att ett kommando ska köra i bakgrunden,
ska man helt enkelt skriva tecknet & efter kommandot.$ gzip emacs &
[1] 2792
$ ls
bellman dikter/ emacs* emacs.gz lenngren
$ date
tor feb 5 14:37:28 CET 1998
$ ls -l
total 625
-rw------- 1 göran göran 372 feb 1 16:48 bellman
drwxrwxr-x 2 göran göran 1024 feb 1 17:12 dikter/
-rwxrwxr-x 1 göran göran 632176 feb 5 14:19 emacs.gz*
-rw-rw-r-- 1 göran göran 649 feb 1 15:53 lenngren
[1]+ Done gzip emacs
$Eftersom jag satte tecknet
& efter kommandot gzip emacs, kördes det i bakgrunden.
Därför återkom prompten genast efter att ett
meddelande, [1] 7809, skrivits ut. Därigenom kunde jag
ge andra kommandon, som ls och date, medan
gzip arbetade med att komprimera filen emacs.
Siffran 7809 är ett slags namn,
processidentifikationsnumret, som systemet gav kommandot
som bestod i att köra gzip på emacs.
Numret 1 som skrevs ut är ett namn,
jobbnumret, som skalet gav kommandot.
Vilken nytta man kan ha av processidentifikationsnumret
ska vi berätta i avsnitt 5.5.
I det här avsnittet intresserar vi oss bara för jobbnumret.
När jobb nummer 1 var klart meddelades detta
med utskriften [1]+ Done.
(Eller snarare, när ett jobb är klart väntar skalet med att
tala om detta tills det nästa gång får tillfälle att skriva ut en
prompt. Därigenom slipper man bli störd medan man skriver
något.) Man kan se ovan att filen komprimerades till lite drygt
en tredjedel av sin ursprungliga storlek. Den komprimerade
filen har samma namn som den ursprungliga men med tillägget .gz.
Kommandon som inte kör i bakgrunden sägs köra
i förgrunden. Om ett kommando som kör i förgrunden visar
sig ta alltför lång tid, behöver man inte nödvändigtvis avbryta det med
C-c. I stället kan man trycka C-z.
Då stoppas körningen, men bara tillfälligt.
Den kan fortsätta från samma punkt vid ett senare tillfälle
då vi har tid att vänta.
En körning som har avbrutits med C-c
kan däremot inte återupptas.
I exemplet nedan börjar jag dekomprimera filen
emacs.gz i förgrunden med kommandot gunzip,
men stoppar kommandot efter en stund:$ gunzip emacs.gz Efter en stund trycker jag C-z
[1]+ Stopped gunzip emacs.gz
$ ls
bellman dikter/ emacs emacs.gz* lenngren
$Kommandot är nu stoppat. Det har fått jobbnummer 1,
men det sitter bara och väntar på nya signaler.
Vi kan aktivera kommandot igen, och sätta det i
förgrunden, med kommandot
fg %1. Procenttecknet följt av ett nummer är en
referens till jobbet med detta nummer.$ fg %1
gunzip emacs.gz
$ ls
bellman dikter/ emacs* lenngren
$En liten stund efter kommandot fg %1 återvände promtpen,
och då var filen komprimerad.
Vi gör nu ett nytt experiment:$ gzip -9 emacs Efter en stund trycker jag C-z
[1]+ Stopped gzip -9 emacs
$Flaggan -9 gör att gzip
försöker komprimera bättre, men oftast blir enda skillnaden
att det tar längre tid. Efter en stund stoppade jag
kommandot med C-z.
För att få reda på vilka jobb som är igång, inklusive de som är
stoppade, ska man ge kommandot jobs.$ jobs
[1]+ Stopped gzip -9 emacs
$Man kan aktivera ett stoppat jobb, och låta det fortsätta i
bakgrunden, med kommandot bg.$ bg %1
[1]+ gzip -9 emacs &
$ ls
bellman dikter/ emacs* emacs.gz lenngren Jag väntar en stund...
$ ls
bellman dikter/ emacs.gz* lenngren
[1]+ Done gzip -9 emacs
$ rm emacs.gz
$Jag lät det stoppade
jobbet köra vidare i bakgrunden genom att
ge kommandot bg %1. Medan jobbet var igång
kunde jag använda skalet; i körningen ovan gav jag kommandot
ls samtidigt som
komprimeringskommandot körde i bakgrunden.
Jag väntade en sedan stund. Efter att jag gett
kommandot ls igen, skrev skalet ut att
bakgrundsjobbet var klart.
Förmodligen blev det klart några sekunder tidigare,
medan jag väntade. Skalet meddelar ju inte
användaren genast när ett bakgrundskommando är klart,
utan först när det får tillfälle att skriva ut en ny prompt.