Come usare nohup per eseguire comandi in background e tenerlo in esecuzione dopo l’uscita da una shell promt

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *