# Nohup

nohup è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX, che esegue un altro comando facendogli ignorare il segnale SIGHUP, in modo da permettergli di proseguire l'esecuzione anche in caso di una disconnessione dal terminale, o della chiusura dell'emulatore di terminale.

## Uso

La sintassi generale di nohup è la seguente:
Il parametro comando indica il comando da eseguire, ed i parametri facoltativi arg i suoi parametri.
Se lo standard output di nohup è diretto ad un terminale, il comando viene avviato effettuando la redirezione dello standard output verso il file nohup.out nella directory corrente; se ciò non fosse possibile (ad esempio per problemi di permessi), esso viene rediretto al file nohup.out nella directory indicata dalla variabile d'ambiente HOME, che normalmente è la home directory dell'utente che avvia nohup. Analogamente, se lo standard error è diretto ad un terminale, esso viene rediretto alla stessa destinazione dello standard output.
La versione GNU di nohup, in aggiunta a quanto sopra, effettua un controllo ulteriore: se lo standard input proviene da un terminale, esso viene rediretto dal dispositivo a caratteri /dev/null.
È da notare che nohup non attiva di per sé l'esecuzione in background del comando: essa si può ottenere sfruttando le capacità di job control della shell testuale, ad esempio terminando la linea con una "e" commerciale ("&").

## Implementazioni

Alcune shell (i.e., bash) forniscono un builtin della shell che può essere utilizzato per impedire l'invio o la propagazione di SIGHUP a lavori esistenti, anche se non sono stati avviati con nohup. In bash, ciò può essere ottenuto utilizzando disown -h job; utilizzando lo stesso builtin senza argomenti rimuove il lavoro dalla tabella dei lavori, implicando anche che il lavoro non riceverà il segnale. Prima di utilizzare disown su un lavoro attivo, dovrebbe essere fermato con Ctrl-Z e continuato in background con il comando bg. Un'altra opzione rilevante di bash è shopt huponexit, che invia automaticamente il segnale HUP ai lavori quando la shell esce normalmente.
Le versioni di nohup di AIX e Solaris hanno un'opzione -p che modifica un processo in esecuzione per ignorare futuri segnali SIGHUP. A differenza del builtin disown descritto sopra di bash, nohup -p accetta gli ID dei processi.
Il comando nohup è stato anche portato al sistema operativo IBM i.

## Risolvere il blocco

Si noti che l'utilizzo di nohup su lavori in background viene tipicamente utilizzato per evitarne la terminazione durante il logout da una sessione remota di SSH. Un problema diverso che spesso si verifica in questa situazione è che ssh rifiuta di eseguire il logout ("si blocca"), poiché rifiuta di perdere dati da/per il/i lavoro/i in background. Questo problema può essere risolto anche ridirezionando tutti e tre i flussi di I/O:
Si noti anche che una sessione SSH che viene chiusa non invia sempre un segnale HUP ai processi dipendenti, ad esempio quando non è stato allocato uno pseudoterminal.

## Esempi

Avvia una copia (tramite il comando cp) della directory /home/utente/dati nella directory /mnt/backup, effettuando per sicurezza la redirezione dello standard input da /dev/null. La copia viene eseguita in background (notare la "&" al termine della linea):

## Alternative

Il programma GNU Screen offre la possibilità di disconnettere il terminale senza che ciò comporti la chiusura della sessione di lavoro ed i programmi in essa avviati, in maniera funzionalmente equivalente a nohup, ma con la possibilità di riconnettersi in un momento successivo, anche da un terminale diverso.