it-swarm.it

Differenza tra Nohup, disown e &

Quali sono le differenze tra

$ Nohup foo

e

$ foo &

e

$ foo & 
$ disown
600
lesmana

Diamo prima un'occhiata a cosa succede se un programma viene avviato da una Shell interattiva (connessa a un terminale) senza & (e senza alcun reindirizzamento). Quindi supponiamo che tu abbia appena digitato foo:

  • Viene creato il processo che esegue foo.
  • Il processo eredita stdin, stdout e stderr dalla shell. Pertanto è anche collegato allo stesso terminale.
  • Se Shell riceve un SIGHUP, invia anche un SIGHUP al processo (che normalmente causa il termine del processo).
  • Altrimenti Shell attende (è bloccato) fino al termine del processo.

Ora, vediamo cosa succede se metti il ​​processo in background, ovvero digita foo &:

  • Viene creato il processo che esegue foo.
  • Il processo eredita stdout/stderr dalla Shell (quindi scrive ancora sul terminale).
  • Il processo in linea di principio eredita anche lo stdin, ma non appena tenta di leggere dallo stdin, viene interrotto.
  • Viene inserito nell'elenco dei processi in background gestiti da Shell, il che significa in particolare:
    • È elencato con jobs ed è possibile accedervi usando %n (dove n è il numero del lavoro).
    • Può essere trasformato in un lavoro in primo piano usando fg, nel qual caso continua come se non avresti usato & su di esso (e se è stato arrestato a causa del tentativo di leggere dall'input standard, ora può procedere alla lettura dal terminale).
    • Se la Shell ha ricevuto un SIGHUP, invia anche un SIGHUP al processo. A seconda della shell e possibilmente delle opzioni impostate per la shell, al termine della shell invierà anche un SIGHUP al processo.

Ora disown rimuove il lavoro dall'elenco dei lavori della Shell, quindi tutti i punti di cui sopra non si applicano più (incluso il processo che viene inviato a SIGHUP dalla Shell). Tuttavia nota che ancora è collegato al terminale, quindi se il terminale viene distrutto (cosa che può accadere se fosse un pty, come quelli creati da xterm o ssh e il programma di controllo viene chiuso chiudendo xterm o terminando la connessione SSH ), il programma fallirà non appena tenta di leggere dallo standard input o scrivere allo standard output.

Ciò che fa Nohup, invece, è separare efficacemente il processo dal terminale:

  • Chiude l'input standard (il programma sarà no in grado di leggere qualsiasi input, anche se viene eseguito in primo piano. non viene arrestato, ma riceverà un codice di errore o EOF).
  • Reindirizza l'output standard e l'errore standard sul file Nohup.out, quindi il programma non fallirà per la scrittura sull'output standard se il terminale fallisce, quindi qualunque cosa il processo scriva non andrà persa.
  • Impedisce al processo di ricevere un SIGHUP (quindi il nome).

Si noti che Nohup fa no rimuove il processo dal controllo del lavoro di Shell e non lo mette in background (ma poiché un lavoro in primo piano Nohup è più o meno inutili, in genere lo metti in background usando &). Ad esempio, a differenza di disown, Shell ti dirà comunque quando il processo Nohup è stato completato (a meno che, ovviamente, Shell non sia stata terminata prima).

Quindi per riassumere:

  • & mette il lavoro in background, cioè lo blocca nel tentativo di leggere l'input e fa in modo che Shell non attenda il suo completamento.
  • disown rimuove il processo dal controllo dei lavori di Shell, ma lo lascia comunque collegato al terminale. Uno dei risultati è che Shell non gli invierà un SIGHUP. Ovviamente, può essere applicato solo ai lavori in background, poiché non è possibile inserirlo quando è in esecuzione un lavoro in primo piano.
  • Nohup disconnette il processo dal terminale, reindirizza il suo output su Nohup.out e lo protegge da SIGHUP. Uno degli effetti (quello di denominazione) è che il processo non riceverà alcun SIGHUP inviato. È completamente indipendente dal controllo dei lavori e in linea di principio potrebbe essere utilizzato anche per i lavori in primo piano (anche se non è molto utile).
595
celtschk

Utilizzando & fa funzionare il programma in background, quindi riceverai un nuovo prompt della shell invece di bloccarlo fino alla fine del programma. Nohup e disown sono in gran parte indipendenti; sopprimono i segnali SIGHUP (blocco) in modo che il programma non venga automaticamente ucciso quando il terminale di controllo viene chiuso. Nohup fa questo all'inizio del lavoro. Se non si Nohup un lavoro all'inizio, è possibile utilizzare disown per modificare un lavoro in esecuzione; senza argomenti modifica il lavoro corrente, che è stato appena eseguito il background

174
Michael Mrozek

Ecco la mia esperienza nel tentativo di eseguire soffice in background, seguendo un comando non terminante (ad esempio tail). Per questo esempio userò sleep 100.

&

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I vedi soffice registri/premendo Ctrl-C soffice si ferma

Nohup .. &

#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I non vedo soffice registri/premendo Ctrl-C il soffice si ferma

e rinnegare

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

I vedi soffice registri/premendo Ctrl-C soffice si ferma

setsid .. &

#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I vedi soffice registri/premendo Ctrl-C soffice NON SI FERMA

Per risparmiare spazio:
Nohup setsid ..: non mostra log/soffice NON SI FERMA su Ctrl-C
Nohup con & disown alla fine: non mostra i log/soffice si ferma su Ctrl-C

9
Marinos An