Quando hai bisogno di "nohup" se stai già eseguendo il fork usando "&"?


26

Innanzitutto questa domanda è collegata ma sicuramente non è la stessa di questa bella domanda:

Differenza tra nohup, disown e &

Voglio capire qualcosa: quando faccio '&', sto biforcando giusto?

È mai utile fare "nohup ... &" o è semplicemente e sufficiente?

Qualcuno potrebbe mostrare un caso in cui useresti "&" e vorresti comunque usare "nohup"?


1
Hai letto la risposta accettata e il relativo thread dei commenti? Spiegano cosa nohupfa. Quale parte hai confuso?
Gilles 'SO- smetti di essere malvagio' il

3
@Gilles: potrebbe essere ovvio per te , perché ti capita di avere familiarità con queste cose (visto il tuo rappresentante) ... Tuttavia, per cominciare, la risposta accettata nel link che ho inserito non dice una parola sull'uso entrambi nohup e '&' ... Sono abbastanza sicuro che la mia domanda sia abbastanza chiara e abbastanza diversa dall'altra, e due grandi risposte qui sembrano dimostrarlo; ) Inoltre, stai davvero sottintendendo che ho preso la briga di collegarmi a un'altra domanda, ma senza leggere la risposta accettata !?
Cedric Martin,

Risposte:


32

Prima di tutto, ogni volta che si esegue un comando, la shell eseguirà il fork di un nuovo processo, indipendentemente dal fatto che lo si esegua &o meno. &significa solo che lo stai eseguendo in background.

Nota che questo non è molto preciso. Alcuni comandi, come ad esempio cdsono funzioni di shell e di solito non eseguono il fork di un nuovo processo. type cmddi solito ti dirà se cmdè un comando esterno o una funzione di shell. type typeti dice che typeè di per sé una funzione di shell.

nohupè qualcosa di diverso. Indica al nuovo processo di ignorare SIGHUP. È il segnale inviato dal kernel quando la shell genitore è chiusa.

Per rispondere alla tua domanda, procedi come segue:

  1. esegui emacs & (per impostazione predefinita dovrebbe essere eseguito in una finestra X separata) .
  2. sulla shell padre, esegui exit.

Noterai che la emacsfinestra viene uccisa, nonostante sia in esecuzione in background. Questo è il comportamento predefinito e nohupviene utilizzato proprio per modificarlo.

Eseguire un lavoro in background (con &o bg, scommetto che anche altre shell hanno anche altre sintassi) è una funzione di shell, derivante dalla capacità dei sistemi moderni di eseguire il multitasking. Invece di sborsare una nuova istanza di shell per ogni programma che si desidera avviare, gusci moderni ( bash, zsh, ksh, ...) avranno la possibilità di gestire un elenco di programmi (o lavori ). Solo uno di questi alla volta può essere in primo piano , il che significa che ottiene il focus shell. Vorrei che qualcuno potesse ampliare maggiormente le differenze tra un processo in esecuzione in primo piano e uno in background (il principale è l'accesso a stdin/ stdout).

In ogni caso, ciò non influisce sul modo in cui il processo figlio reagisce SIGHUP. nohuplo fa.


+1 a entrambi per le grandi risposte ... Ma sono ancora confuso ... Ho provato a farlo prima di rispondere alla mia domanda: forse la mia (molto vecchia) installazione di Debian Linux non è configurata correttamente ma se "emacs & "e quindi digitare" exit ", solo il mio xterm esce: emacs rimane lì.
Cedric Martin,

Emacs è abbastanza complicato da poter gestire SIGHUP da solo. È solo per impostazione predefinita che i processi terminano su SIGHUP. Molti programmi "daemon" come ntpd o inetd rileggeranno la loro configurazione su SIGHUP invece di uscire. Anch'io sono un ragazzo vim, quindi non ho molta esperienza con nessun emacs.
Bruce Ediger,

3
Non c'è niente di speciale in Emacs. Una shell in genere invia SIGHUPai suoi processi figlio quando la shell stessa riceve SIGHUP, non quando la shell esce normalmente. bash ha un'opzione huponexitche lo fa inviare SIGHUPai bambini quando esce, ma non è abilitato di default. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson

Ciao. prima di tutto un'ottima spiegazione. Ho provato a verificare la tua tesi eseguendo un processo con &e ho chiuso la mia shell eseguendo exit. Il processo è ancora in esecuzione. Qualche idea sul perché non è stato ucciso? O mi sto perdendo qualcosa qui?
Ali Yılmaz,

Qual è il processo che stai eseguendo?
Rahmu,

16

È mai utile fare nohup ... &? Sì. Se si avvia un processo "in background" con &, quel nuovo processo ha ancora l'appartenenza al "gruppo di processi" della shell originale. Se quella shell o il gruppo di processi ricevono determinati segnali (SIGHUP, ad esempio), per impostazione predefinita escono. Ciò significa che se si esegue un processo con &da una shell avviata da un xterm, o rxvt o qualche altro emulatore di terminale per finestre, quando si chiude la finestra, il processo in background ottiene un SIGHUP. La maggior parte del codice scritto casualmente non gestisce SIGHUP e quindi esce.

In tal caso nohup ... &, il nohupcomando imposta SIGHUP su ignorato, quindi esegue il comando. Quel comando appena eseguito mantiene la maschera di segnale nohupconfigurata, a meno che il comando non esegua la gestione del segnale stesso. Se chiudi xterm o rxvt o altro, il kernel consegna SIGHUP al processo del comando, che viene ignorato. Continua a correre.

Eseguendo un nohupcomando su gli consente di continuare a funzionare dopo aver chiuso xterm o dopo essersi disconnesso.


Scusa, mi hai perso. Stai dicendo che usare &con nohupmantiene il comando in esecuzione in certi casi in cui solo usare nohupnon lo farebbe? Ciò sembra essere in conflitto con la risposta qui: unix.stackexchange.com/a/288064/1822
Mike B

2
@MikeB - Il "&" fa il solito fork / set things / exec chiamate di sistema per mettere il comando "in background". Cioè, il comando che non viene supportato viene eseguito in modo asincrono. Ciò nohupfa alcune cose prima che il exec()sistema chiami per fare in modo che il processo biforcuto ignori determinati segnali. Quindi, sì, un "&" consentirà l'esecuzione di un comando in determinate circostanze che un vecchio nohupnon avrebbe. Come chiudere l'xterm associato alla shell che ha eseguito il nohup o disconnettersi.
Bruce Ediger,

-1

se esegui un programma in background (con & come suffisso) sul sistema operativo Linux e disconnetti anche dopo, continuerà a funzionare: prova con:

  ping google.com > ping_result  &

Dopo il login, controlla il numero di righe nel file di output ping_resultche continueranno ad aumentare, significa che è ancora in esecuzione, ma è stato detto che verrà chiuso. allora a che serve il nohupcomando.

un altro scenario ==> come indicato sopra per nohup emac &-> che dovrebbe continuare a emacfunzionare dopo il logout del sistema ma non viene mostrato in esecuzione dopo il login.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.