next up previous contents
Nästa: 3.3 In- och utdata Upp: 3. Kommandotolken Förra: 3.1 Jokertecken

  
3.2 Jobb

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


next up previous contents
Nästa: 3.3 In- och utdata Upp: 3. Kommandotolken Förra: 3.1 Jokertecken
Goran Andersson
1999-03-08