nohup

comando dei sistemi operativi Unix e Unix-like

nohup è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX[1], 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 modifica

La sintassi generale di nohup è la seguente:

nohup comando [arg1 [arg2 …] ]

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 modifica

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.[2] Un'altra opzione rilevante di bash è shopt huponexit, che invia automaticamente il segnale HUP ai lavori quando la shell esce normalmente.[3]

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.[4]

Il comando nohup è stato anche portato al sistema operativo IBM i.[5]

Risolvere il blocco modifica

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.[6][7] Questo problema può essere risolto anche ridirezionando tutti e tre i flussi di I/O:

$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &

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 un pseudoterminal.[8]

Esempi modifica

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):

nohup cp -R /home/utente/dati /mnt/backup </dev/null &

Alternative modifica

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.

Note modifica

  1. ^ (EN) nohup, in The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition. URL consultato l'8 giugno 2008.
  2. ^ Bash Reference Manual (archiviato dall'url originale il 3 dicembre 2010).. Gnu.org. Consultato il 13-04-2015.
  3. ^ Bash Reference Manual (archiviato dall'url originale il 3 dicembre 2010).. Gnu.org. Consultato il 13-04-2015.
  4. ^ IBM Knowledge Center (archiviato dall'url originale il 15 ottobre 2014).. 01.ibm.com (2015-03-26). Consultato il 13-04-2015.
  5. ^ (EN) IBM, IBM System i Version 7.2 Programming Qshell, su IBM. URL consultato il 5 settembre 2020.
  6. ^ Domande frequenti su SSH, su snailbook.com. URL consultato il 10 giugno 2009 (archiviato dall'url originale il 22 gennaio 2009).
  7. ^ FAQ di OpenSSH, su openssh.com, 20 settembre 2005. URL consultato il 10 giugno 2009 (archiviato dall'url originale il 10 luglio 2009).
  8. ^ Bug 396 – sshd abbandona i processi quando non è allocato un pty, su bugzilla.mindrot.org. URL consultato il 10 giugno 2009.

Collegamenti esterni modifica

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica