Qual è la funzione del comando nohup?


18

Sono un principiante in Ubuntu. Ho imparato un comando

nohup [command]- <command>Esegui immune al segnale di riaggancio

Non riesco a capire il significato di " immune al segnale di riaggancio ". Di che tipo di segnale sta parlando? E per favore dimmi come usare questo comando con un esempio.


Se disponibile nella shell, disownè un'alternativa migliore a nohup. Background un comando con command &o Ctrl-Z, quindi utilizzare disownper staccarlo dalla shell.
John Kugelman supporta Monica il

@JohnKugelman non è sufficiente , hai deviato anche il flusso di input, output ed errore. Quindi perché non usare 'nohup' che lo fa automaticamente per te?
miracle173

Risposte:


34

Consideriamo che hai aperto un gediteditor di testo da un terminale e ci stai lavorando. Se si chiude il terminale prima della chiusura gedit, anche gedit si chiude non appena si chiude il terminale. Quindi cosa sta succedendo qui? Il geditviene eseguito come un processo figlio sotto il terminale. Quando si chiude il terminale viene inviato un segnale di riaggancio ( SIGHUP) al processo che interrompe il processo figlio.

D'altra parte, se si desidera che il processo figlio (qui gedit) continui a funzionare anche dopo aver chiuso il terminale padre, si vorrebbe che il processo fosse immune al segnale di riaggancio. In modo che la chiusura del terminale non chiuda il processo figlio. nohupfa esattamente questo lavoro.

nohupnon disconnette un comando dal terminale , fa sì che lo script ignori SIGHUP e reindirizza stdout / stderr su un file nohup.out, in modo che il comando possa continuare a essere eseguito in background dopo la disconnessione. Se si chiude la shell / terminale o si disconnette, il comando non è più figlio di quella shell. Appartiene al processo di init. Se cerchi in pstree, vedrai che ora appartiene al processo 1 (init). Questo non può essere riportato in primo piano perché il primo piano non esiste più.


16

Oltre a ciò che ha scritto @sourvac, questo è un retaggio di Back In The Day in cui le persone hanno effettuato l'accesso tramite terminali stupidi di solo testo, spesso tramite modem (l'originale 110 baud analogico): "riagganciare" è letteralmente "riagganciare il telefono ".

Un pid immune al segnale di riaggancio continuerà a funzionare anche dopo essersi disconnesso e aver riagganciato il telefono . Questo è stato molto utile su computer lenti quando i lavori sono stati eseguiti per ore e ore e non si poteva semplicemente rimanere connessi (qualcun altro aveva bisogno di usare il terminale, era necessario usare il telefono, statico nella linea poteva "bzzt" la connessione , eccetera).


1
Non appena indietro nel tempo. Eseguo la maggior parte dei miei lavori di grandi dimensioni in un cluster di server in cui mi trovo. Se non avessi usato Nohup, avrei dovuto lasciare il mio laptop collegato a quelle macchine per giorni in attesa che i lavori finissero.
Ray

@Ray che ne dici di eseguirli tramite "at" o come cron job?
Ron John

@RonJohn Certo. O tramite un motore a griglia. Non intendevo suggerire che nohup fosse l'unica opzione, solo che oggi è ancora utilizzato per questo scopo.
Ray

1
Forse le tue osservazioni storiche sono corrette. Ma le tue conclusioni sulla sua attuale importanza sono sbagliate. Non è utile su computer lenti ma è utile per lavori di lunga durata. Queste sono due cose diverse. Usi "nohup" per proteggere il tuo lavoro dalla disconnessione intenzionale o non intenzionale del tuo terminale. Anche oggi non sei contento se un lavoro si interrompe perché un errore di rete disconnette il tuo terminale e il tuo lavoro viene interrotto.
miracle173

I lavori di @Ray Cron sono del tutto inappropriati per raggiungere questo obiettivo. I cronjob sono per attività periodiche, devi impostare l'ambiente nel cronjob e considerare molte altre cose. Forse 'at' è un po 'più facile da gestire ma tuttavia più complesso di nohup.
miracle173
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.