Introduzione
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 (hangup), in modo da permettergli di proseguire l'esecuzione anche in caso di una disconnessione dal terminale, o della chiusura dell'emulatore di terminale.
SIGHUP è un segnale inviato a un processo quando il suo terminale di controllo è chiuso.
Normalmente quando si esegue un comando su SSH se la connessione si interrompe, o si disconnette, la sessione SSH viene interrotta e tutti i comandi eseguiti dal terminale si interrompono.
Nohup server per evitare l'interruzione dei comandi.
Ignorerà tutti i segnali di hangup e i comandi continueranno a funzionare.
Come utilizzare il comando nohup
La sintassi per il comando nohup è la seguente:
nohup COMMAND [ARGS]
Il comando non accetta altre opzioni tranne lo standard --help e --version.
Diamo un'occhiata al seguente esempio:
nohup mycomand
Dovreste ricevere un messaggio di output simile al seguente:
nohup: ignora input e aggiunge output a 'nohup.out'
nohup eseguirà il comando mycommand in foreground e reindirizza l'output del comando al file nohup.out.
Questo file verrà creato nella directory di lavoro corrente.
Se l'utente che esegue il comando non dispone delle autorizzazioni di scrittura per la directory di lavoro, il file verrà creato nella directory home dell'utente.
Se si chiude il terminale, il comando non verrà terminato.
Esecuzione del comando in background
L'utilizzo di nohup in foreground non è molto utile in quanto non sarà possibile interagire con la shell fino al completamento del comando.
Per eseguire nohup in background, aggiungere il simbolo & al termine del comando:
nohup mycomand &
Quando si esegue il comando in background, l'ID del processo della shell (circondato da parentesi) e l'ID del processo verranno stampati sul terminale:
Dovreste ricevere un messaggio di output simile al seguente:
[1] 13265
Se per qualche motivo si desidera interrompere il processo, utilizzare il comando kill seguito dall'ID del processo:
kill -9 13265
Reindirizzamento dell'output su un file
Per impostazione predefinita, nohup reindirizza l'output al file nohup.out.
Se si desidera reindirizzare l'output del comando in un file diverso, è possibile utilizzare il reindirizzamento della shell standard.
Ad esempio per reindirizzare lo standard output e l'errore standard sul file mycommand.out si utilizzerà:
nohup mycommand > mycommand.out 2>&1 &
Per reindirizzare lo standard output e l'errore standard su file diversi:
nohup mycommand > mycommand.out 2> mycommand.err &
Alternative
Esistono numerosi programmi alternativi che è possibile utilizzare per evitare la chiusura di un comando quando si chiude il terminale o si disconnette.
Screen
Screen o GNU Screen è un programma multiplexer terminale che consente di avviare una sessione di schermate e di aprire qualsiasi numero di finestre (terminali virtuali) all'interno di quella sessione.
I processi in esecuzione nella schermata continueranno a essere eseguiti quando la loro finestra non è visibile anche se ci si disconnette.
Per maggiori informazioni: Come utilizzare il comando Screen per le sessioni su Linux.
Tmux
Tmux è una moderna alternativa allo schermo GNU.
Con Tmux puoi anche creare una sessione e aprire più finestre all'interno di quella sessione.
Le sessioni di Tmux sono persistenti, il che significa che i programmi in esecuzione in Tmux continueranno a funzionare anche se si chiude il terminale.
Disown
disown è una shell incorporata che rimuove un lavoro di shell dal controllo del lavoro della shell. A differenza di nohup, puoi usare Disown anche sui processi in esecuzione.
Conclusione
A questo punto dovresti avere una buona conoscenza di come usare il comando nohup per impedire che i comandi vengano terminati quando effettui il logout o ti disconnetti dal terminale.