GNU/Linux >> Linux Esercitazione >  >> Linux

Comando Nohup con esempi

Nohup sta per 'no hang up' e, come indica il nome, impedisce che il comando venga interrotto automaticamente quando ci si disconnette o si esce dalla shell.

Quando esegui un comando Linux e ti disconnetti dopo un po' di tempo dalla sessione se il comando non ha terminato l'esecuzione, il suo processo verrà interrotto.

Ci sono tutti i tipi di programmi che richiedono molte ore per essere completati. Non è necessario attendere che il comando completi l'intera attività. Possiamo mantenere i programmi in esecuzione in background usando il comando nohup e controllare l'output in un secondo momento.

Sintassi del comando nohup

La sintassi del comando nohup è:

nohup COMMAND [ARG]...

Per impostazione predefinita, l'output di un comando viene visualizzato sul dispositivo di output standard che è il terminale che ha avviato il processo. Ma poiché il terminale potrebbe essere chiuso durante la vita del processo figlio, il terminale non può più essere il dispositivo di output. Secondo la pagina delle informazioni del comando nohup,

If standard output is a terminal, the command's standard output is appended to the file `nohup.out'; if that cannot be written to, it is appended to the file `$HOME/nohup.out'; and if that cannot be written to, the command is not run. Any `nohup.out' or `$HOME/nohup.out' file created by `nohup' is made readable and writable only to the user, regardless of the current umask settings.

Allo stesso modo per l'errore standard,

If standard error is a terminal, it is normally redirected to the same file descriptor as the (possibly-redirected) standard output. However, if standard output is closed, standard error terminal output is instead appended to the file `nohup.out' or `$HOME/nohup.out' as above.

Significa che per impostazione predefinita sia l'output standard che l'errore standard vengono reindirizzati al file "nohup.out". Ma se desideri reindirizzare l'output su un altro file, puoi sempre farlo utilizzando l'operatore di reindirizzamento. Ad esempio, per catturare l'output di make,

nohup make > make.log

Per input standard,

If standard input is a terminal, it is redirected from `/dev/null' so that terminal sessions do not mistakenly consider the terminal to be used by the command. This is a GNU extension; programs intended to be portable to non-GNU hosts should use `nohup COMMAND [ARG]...

Il comando nohup non mette automaticamente il comando in background. Questo deve essere fatto esplicitamente con &.

nohup make > make.log &

Inoltre, questo comando non cambia la gentilezza (cioè la priorità) di un comando. Per questo, si usa il comando nice come ad esempio 'nohup nice COMMAND'.

Come usare il comando nohup

Possiamo usare nohup in due modi. Il primo è eseguire il comando con i parametri senza ricevere alcun altro input durante il lavoro. Tutto l'output, inclusi eventuali messaggi di errore, verrà scritto nel file nohup.out nella directory di lavoro o nella directory home. Se il comando è ancora in esecuzione quando ci si disconnette o si chiude il terminale, non verrà terminato.

Proviamo un esempio con l'applicazione memtester.

$ nohup sudo memtester 2048 5
nohup: ignoring input and appending output to 'nohup.out'
Killed

$ cat nohup.out 
memtester version 4.3.0 (64-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 2048MB (2147483648 bytes)
got  1876MB (1968074752 bytes), trying mlock ...

Puoi anche reindirizzare l'output a qualche altro file invece di nohup.out usando> simbolo.

$ nohup sudo memtester 2048 5 > result.txt

Usa il comando nohup con '&'

Per avviare un processo e metterlo in background, in pratica esegui il comando seguito dal simbolo "&". Il simbolo "&" alla fine del comando indica a bash di eseguire nohup yourcommand sullo sfondo. Può essere riportato in primo piano con il comando fg.

$ nohup bash sleep1.sh &
[1] 653
$ nohup: ignoring input and appending output to 'nohup.out'
fg
-bash: fg: job has terminated
[1]+  Exit 127                nohup bash sleep1.sh

Esegui più comandi in background

Puoi eseguire più comandi in background usando il comando nohup. Nell'esempio seguente, i comandi mkdir, touch e ls vengono eseguiti in background utilizzando i comandi nohup e bash.

$ nohup bash -c 'mkdir TestDir && touch test2.file && ls'> output.txt
nohup: ignoring input and redirecting stderr to stdout

$ cat output.txt 
TestDir
nohup.out
output.txt
test2.file
testfile.txt

Inizio e fine del processo in background

Se esegui il comando ping usando nohup, il processo non terminerà alla chiusura del terminale.

$ nohup ping -i 15 linoxide.com &
[1] 806
$ nohup: ignoring input and appending output to 'nohup.out'

Puoi chiudere il terminale e riaprirlo. Ora esegui il comando pgrep con -a opzione.

$ pgrep -a ping
816 ping -i 15 linoxide.com

Otterrai l'elenco dei processi con l'ID del processo in esecuzione. Come puoi vedere, il comando ping che abbiamo lasciato in esecuzione non è terminato. Per terminare qualsiasi processo in background, devi eseguire il comando kill. Come parametro, dobbiamo utilizzare il particolare ID processo in esecuzione.

Nel nostro caso, l'ID del processo è 816. Esegui kill 816 per terminare il processo.

$ pgrep -a ping
816 ping -i 15 linoxide.com
$ kill 816

Conclusione

Nohup è molto utile quando devi eseguire script di shell. Tmux, Screen e Disown sono alcune delle utilità alternative che fanno lo stesso lavoro di nohup.

Spero che ora tu abbia familiarità con questo strumento che può essere utile in molti casi. Se hai domande o commenti, pubblicali qui sotto.


Linux
  1. Comando wc Linux con esempi

  2. Comando di ordinamento Linux con esempi

  3. Comando Tee Linux con esempi

  4. Comando testa di Linux con esempi

  5. Comando JQ in Linux con esempi

15 Comando Linux ps con esempi

Comando CD Linux con esempi

Comando Linux watch con esempi

Comando Nohup Linux con esempi

Comando IP Linux con esempi

Comando della cronologia con esempi