La maggior parte del tempo si accede al server remoto tramite ssh. Se si avvia uno script o un comando di shell e si esce (si interrompe la connessione remota), il processo/comando verrà ucciso. A volte un lavoro o un comando richiede molto tempo. Se non siete sicuri quando il lavoro finirà, allora è meglio lasciare lavoro in esecuzione in background., Ma, se ci si disconnette dal sistema, il lavoro verrà arrestato e terminato dalla shell. Cosa fai per mantenere il lavoro in esecuzione in background quando il processo diventa SIGHUP?
nohup comando per il salvataggio
In queste situazioni, possiamo usarenohup
riga di comando-utility che permette di eseguire comando/processo o script di shell che può continuare a correre in background dopo ci disconnettiamo da una shell.
nohup è un comando POSIX per ignorare il segnale HUP (hangup)., Il segnale HUP è, per convenzione, il modo in cui un terminale avverte i processi dipendenti di logout.
L’output che normalmente va al terminale va in un file chiamato nohup.se non è già stato reindirizzato.
nohup sintassi del comando:
la sintassi è La seguente
$ nohup command-name &$ exit
o
$ nohup /path/to/command-name arg1 arg2 > myoutput.log &$ exit
Dove
-
command-name
: è il nome di script di shell di comando o nome. È possibile passare l’argomento al comando o uno script di shell., -
&
: nohup non mette automaticamente in background il comando che esegue; devi farlo esplicitamente, terminando la riga di comando con un simbolo&. -
exit
: dopo nohup e& avviare il comando in background, si dovrà ancora digitare exit o CTRL-D per tornare al cursore bash.,
l’Utilizzo di posti di lavoro -l comando per visualizzare un elenco di tutti i lavori:
$ jobs -l
comando nohup esempi
in Primo luogo, il login al server remoto tramite ssh comando:
$ ssh [email protected]
ho intenzione di eseguire uno script di shell chiamato pullftp.sh:
$ nohup pullftp.sh &
Digitare exit o premere CTRL + D per uscire dal server remoto:
> exit
In questo esempio, sto andando a trovare tutti i programmi e gli script con setuid, immettere:
$ nohup find / -xdev -type f -perm +u=s -print > out.txt &
Digitare exit o premere CTRL + D per uscire dal server remoto., Il lavoro continua a funzionare dopo la tua uscita.
> exit
nohup è spesso usato in combinazione con il comando nice per eseguire processi con una priorità inferiore.
Si noti che nohup non modifica la priorità di pianificazione del COMANDO; utilizzare il comando nice per questo scopo. Ad esempio:
$ nohup nice -n -5 ls / > out.txt &
Come puoi vedere nohup mantiene i processi in esecuzione dopo l’uscita da una shell. Leggi la pagina man di nohup(1) e nice(1) per ulteriori informazioni. Si prega di notare che nohup è quasi disponibile su Solaris / BSD / Linux / UNIX varianti.,
Qual è la differenza tra nohup e e commerciale (&)
Entrambi nohup myprocess.out &
o myprocess.out &
imposta myprocess.fuori a correre in background. Dopo aver spento il terminale, il processo è ancora in esecuzione. Qual è la differenza tra loro?
nohup
cattura il segnale di hangup (vedi man 7 signal
) mentre la e commerciale non lo fa (tranne che la shell è configurata in questo modo o non invia affatto SIGHUP
).,
Normalmente, quando si esegue un comando usando&
e uscendo dalla shell in seguito, la shell terminerà il sottocomando con il segnale di hangup (kill -SIGHUP <pid>
). Questo può essere evitato usando nohup
, poiché cattura il segnale e lo ignora in modo che non raggiunga mai l’applicazione effettiva.
Nel caso tu stia usando bash, puoi usare il comando shopt | grep hupon
per scoprire se la tua shell invia SIGHUP ai suoi processi figli o meno. Se è spento, i processi non verranno terminati, come sembra essere il caso per te., Maggiori informazioni su come bash termina le applicazioni possono essere trovate qui.
Ci sono casi in cui nohup
non funziona, ad esempio quando il processo che si avvia ricollega il segnale SIGHUP
, come è il caso qui.
Argomenti avanzati
Lavori esistenti, processi
Alcune shell (ad esempio bash) forniscono una shell incorporata che può essere utilizzata per impedire che SIGHUP venga inviato o propagato ai lavori esistenti, anche se non sono stati avviati con nohup., In bash, questo può essere ottenuto usando disown -h job
; usando lo stesso builtin senza argomenti rimuove il lavoro dalla tabella dei lavori, il che implica anche che il lavoro non riceverà il segnale. Prima di utilizzare disown
su un lavoro attivo, deve essere interrotto da Ctrl-Z
e continuato in background dal comando bg
. Un’altra opzione bash rilevante è shopt huponexit
, che invia automaticamente il segnale HUP ai lavori quando la shell esce normalmente.,
Le versioni AIX e Solaris di nohup hanno un’opzione -p
che modifica un processo in esecuzione per ignorare i futuri segnali SIGHUP. A differenza di quanto sopra descritto disown
incorporato di bash, nohup -p
accetta ID di processo.
Superare l’impiccagione
Si noti che i lavori in background nohopping vengono in genere utilizzati per evitare di terminarli quando si disconnette da una sessione SSH remota. Un problema diverso che spesso sorge in questa situazione è che ssh si rifiuta di disconnettersi (“si blocca”), poiché si rifiuta di perdere qualsiasi dato da/verso i lavori in background., Questo problema può anche essere superato reindirizzando tutti e tre i flussi di I/O:
$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &
Si noti inoltre che una sessione SSH di chiusura non invia sempre un segnale HUP a processi dipendenti. Tra gli altri, questo dipende dal fatto che uno pseudo-terminale sia stato allocato o meno.
Alternative
Multiplexer terminale
Un multiplexer terminale può eseguire un comando in una sessione separata, staccata dal terminale corrente, il che significa che se la sessione corrente termina, la sessione staccata ei suoi processi associati continua a funzionare. Si può quindi riattaccare alla sessione in seguito.,
Per esempio, la seguente invocazione dello schermo verrà eseguito somescript.sh sullo sfondo di una villa indipendente di sessione:
screen -A -m -d -S somename ./somescript.sh &
disconoscere comando
Il disown comando è utilizzato per eliminare i lavori dalla tabella di lavoro, o per contrassegnare i lavori in modo che un segnale SIGHUP non viene inviato sulla terminazione della sessione.
Ecco come puoi provarlo:
$ pullftp.sh &$ disown -h$ exit
Dalla pagina man bash bash(1):
Per impostazione predefinita, rimuove ogni argomento JOBSPEC dalla tabella dei lavori attivi., Se viene fornita l’opzione-h, il lavoro non viene rimosso dalla tabella, ma viene contrassegnato in modo che SIGHUP non venga inviato al lavoro se la shell riceve un SIGHUP. L’opzione-a, quando JOBSPEC non viene fornito, significa rimuovere tutti i lavori dalla tabella dei lavori; l’opzione-r significa rimuovere solo i lavori in esecuzione.
comando at
È possibile utilizzare il comando at per mettere in coda un lavoro per l’esecuzione successiva. Ad esempio, è possibile eseguire pullftp.sh script in coda (un minuto) dopo l’esecuzione:
$ echo "pullftp.sh" | at now + 1 minute