Sådan lader man programmer køre selv om terminalen lukkes

xcbvcb

Nogle programmer eller scripts tager så lang tid at køre at man ikke har mulighed for (eller gider) vente på de blive færdige. Det kan fx være en søgning efter en tekststreng, nedpakning af et stort antal filer, udsendelse af et nyhedsbrev og mange andre tidskrævende ting.

Hvis man bare lukker terminalen, vil programmet normalt stoppe, men heldigvis er der flere muligheder for at lade programmet fortsætte. Det er naturligvis mest aktuelt på en fjernserver, men nedenstående metoder virker også fint på ens lokale PC, så de er altså nemme at afprøve.

Metode 1, den nemme: nohup

Programmet nohup betyder No Hangup og bevirker at en proces ikke afbrydes selv om forbindelsen “lægges på”. Betegnelsen stammer fra de dage hvor man ringede op via et modem.

Bzip2 giver en meget høj kompression i forhold til zip og gzip, men til gengæld er den ret langsom. Da vi ikke gider vente på at minmappe bliver pakket ned, skriver vi nohup foran:

nohup tar cf - minmappe  | bzip2 > minmappe.bz2 &

Tegnet & i slutningen af kommandoen sender processen i baggrunden så vi med det samme kan lukke terminalen. Evt. output der normal ville skrives til teminalen, ender i stedet i filen nohup.out så man senere kan læse det. I dette eksempel kommer der ikke noget output, men man kan fx køre:

nohup echo Hej verden
cat nohup.out

I stedet for at “Hej verden” ses i terminalen, ender det nu i filen nohup.out.

Nohup er fast inventar i de fleste distroer.

Metode 2, den avancerede: screen

Nohup er fint til mange ting, men hvad hvis man gerne vil vende tilbage til det kørende program senere, eller bare nu og da se hvordan det går? Til dette kan vi bruge det geniale program screen der starter en virtuel terminal.

screen
zip -r minmappe.zip minmappe
Ctrl-A D

Zip skriver hvad den er i gang med undervejs så man kan derfor holde øje med hvor langt den er nået. Når vi har set at pakningen kører som den skal, kan vi trykke Ctrl-A D for at afkoble (detache) sessionen og enten lave noget andet, eller helt lukke terminalen.

Senere kan vi vende tilbage til den gemte session ved at skrive

screen -r

og man vil se at zip stadig er i fuld gang (med mindre den altså er blevet færdig i mellemtiden). Så kan man igen afkoble den med Ctrl-A D, eller - hvis programmet er færdigt - ved at skrive exit for at forlade sessionen helt.

Man kan udmærket have flere sessioner åbne på en gang. Så kan man liste dem med screen -ls og derefter vælge den ønskede session ved at skrive dens pid:

screen -ls

Output:
11074.pts-1.marlar-laptop (27-08-2010 22:31:47) (Detached)
11057.pts-1.marlar-laptop (27-08-2010 22:21:26) (Detached)

screen -r 11074

Endelig kan man navngive en session med screen -S så det er nemmere at vende tilbage til den igen:

screen -S zipning
Ctrl-A D
screen -r zipning

Screen er ikke standard i de fleste distroer, det installeres med pakkesystemet, fx:

aptitude install screen

Metode 3, panikløsningen: disown

Du har sat phplist igang med at sende det seneste nyhedsbrev ud til de 5000 abonnenter da du opdager det er fyraften og gerne vil hjem. Desværre glemte du at bruge nohup eller screen, så hvis du lukker terminalen, stopper afsendelsen, og omvendt er det for risikabelt at lade computeren stå tændt med terminalen åben da enhver så vil have adgang til fjernserveren.

Heldigvis er der en simpel løsning:

Sæt først processen i baggrunden ved at trykke Ctrl-Z og derefter skrive bg. Nu kører nyhedsbrevet som en baggrundsproces, men vi kan stadig ikke lukke terminalen. Skriv derfor:

disown -h

Det fjerner ejerskabet af baggrundsprocesserne så de ikke længere tilhører terminalen og derfor ikke stopper når terminalen lukkes. Programmet fortsætter altså ufortrødent, og du kan roligt holde fyraften uden at få ballade med chefen.

Bemærk at disown ikke umiddelbart giver mulighed for at læse outputtet fra processen, så det er nok at betragte som en nødløsning. Men det har da reddet mig et par gange :-)

Installer disown med:

aptitude install disown

eller hvordan man nu gør i din distro.

Afsluttende bemærkning

I nogle linuxvarianter kan man bare lukke en terminal uden at baggrundsjob stopper. Det gælder fx min NAS som kører Busybox. På den kan jeg hverken bruge nohup, screen eller disown, men til gengæld kan jeg altså bare lukke terminalen hvis blot processen er sat i baggrunden.

*klonk*
Antal: 266
Tilmeldt:
31-01-2004
User is offline
God lille artikel - jeg

God lille artikel - jeg kendte ikke til 'disown' - den skal helt sikkert huskes.


peder2tm
Antal: 128
Tilmeldt:
08-10-2007
User is offline
bruger man zsh, kan man

bruger man zsh, kan man skrive '&!' efter en kommando, så bliver den både backgrounded og disowned.


lbm
lbm's picture
Antal: 824
Tilmeldt:
14-06-2006
User is offline
Fin lille artikel, og god

Fin lille artikel, og god læsning !. :)


marlar
Antal: 3381
Tilmeldt:
05-12-2009
User is offline
Tak for kommentarerne! Det

Tak for kommentarerne! Det er rart at jeg kan begynde at give tilbage af min viden efter at jeg i snart et år med Linux har belemret alle jer andre med de mærkeligste spørgsmål :-)


coe
Antal: 45
Tilmeldt:
09-11-2004
User is offline
Tilføjer lige min stemme

Tilføjer lige min stemme til koret.

Superfedt med sådan nogle artikler, der både er gennemarbejdede og brugbare. Stor ros herfra. Kom endelige med nogle flere :-)

/Carsten


mjjzf
mjjzf's picture
Antal: 1595
Tilmeldt:
25-12-2007
User is offline
Får du ikke almindeligvis

Får du ikke almindeligvis samme resultat ved bare at køre en kommando med & bagefter? Det plejer jeg da at bruge.


marlar
Antal: 3381
Tilmeldt:
05-12-2009
User is offline
#6:Nej. Men som nævnt

#6:

Nej. Men som nævnt under "Afsluttende bemærkning" så er jeg klar over at det er sådan i nogle distributioner, det gælder fx min NAS.

Der kan måske også være forskel på hvilke programmer man prøver det med. Nogle "disowner" måske sig selv når de kommer i baggrunden, det er meget tænkeligt.