GNU/Linux >> Znalost Linux >  >> Linux

Příkaz Nohup s příklady

Nohup znamená 'no hang up', a jak název napovídá, zabraňuje automatickému přerušení příkazu, když se odhlásíte nebo opustíte shell.

Když spustíte linuxový příkaz a po nějaké době se odhlásíte z relace, pokud tento příkaz nedokončí provádění, jeho proces bude ukončen.

Existují nejrůznější programy, jejichž dokončení vyžaduje mnoho hodin. Nemusíme čekat, až příkaz dokončí celý úkol. Programy můžeme nechat spuštěné na pozadí pomocí příkazu nohup a zkontrolovat výstup později.

Syntaxe příkazu nohup

Syntaxe příkazu nohup je:

nohup COMMAND [ARG]...

Ve výchozím nastavení je výstup příkazu zobrazen na standardním výstupním zařízení, což je terminál, který proces spustil. Ale protože terminál může být během života podřízeného procesu uzavřen, terminál již nemůže být výstupním zařízením. Podle informační stránky příkazu 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.

Podobně pro standardní chybu

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.

To znamená, že standardní výstup i standardní chyba jsou přesměrovány do souboru 'nohup.out'. Ale pokud chcete přesměrovat výstup do jiného souboru, můžete to vždy udělat pomocí operátoru přesměrování. Chcete-li například zachytit výstup příkazu make,

nohup make > make.log

Pro standardní vstup

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

Příkaz nohup automaticky neuloží příkaz na pozadí. Toto musí být provedeno explicitně pomocí &.

nohup make > make.log &

Tento příkaz také nemění slušnost (tj. prioritu) příkazu. K tomu se používá příkaz nice jako například 'nohup nice COMMAND'.

Jak používat příkaz nohup

Nohup můžeme použít dvěma způsoby. První je spuštění příkazu s parametry bez přijímání jakéhokoli jiného vstupu při práci. Veškerý výstup, včetně případných chybových zpráv, bude zapsán do souboru nohup.out v pracovním adresáři nebo ve vašem domovském adresáři. Pokud příkaz stále běží, když se odhlásíte nebo zavřete terminál, neukončí se.

Zkusme příklad s aplikací 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 ...

Můžete také přesměrovat výstup do jiného souboru místo nohup.out pomocí> symbol.

$ nohup sudo memtester 2048 5 > result.txt

Použijte příkaz nohup s '&'

Chcete-li spustit proces a umístit jej na pozadí, v podstatě provedete příkaz následovaný symbolem „&“. Symbol "&" na konci příkazu dává bash pokyn ke spuštění nohup yourcommand v pozadí. Lze jej vrátit zpět do popředí pomocí příkazu 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

Spouštět více příkazů na pozadí

Pomocí příkazu nohup můžete na pozadí spustit více příkazů. V následujícím příkladu jsou příkazy mkdir, touch a ls prováděny na pozadí pomocí příkazů nohup a 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

Zahájení a ukončení procesu na pozadí

Pokud spustíte příkaz ping pomocí nohup, proces se po zavření terminálu neukončí.

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

Terminál můžete zavřít a znovu otevřít. Nyní spusťte příkaz pgrep s -a možnost.

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

Získáte seznam procesů s ID procesu, který běží. Jak vidíte, příkaz ping, který jsme nechali spuštěný, není ukončen. Chcete-li ukončit jakýkoli proces na pozadí, musíte spustit příkaz kill. Jako parametr musíme použít konkrétní id procesu, který běží.

V našem případě je ID procesu 816. Proces ukončíte spuštěním kill 816.

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

Závěr

Nohup je velmi užitečný, když musíte spouštět skripty shellu. Tmux, Screen a Disown jsou některé z alternativních nástrojů, které dělají stejnou práci jako nohup.

Doufám, že jste již obeznámeni s tímto nástrojem, který může být v mnoha případech užitečný. Pokud máte nějaké dotazy nebo komentáře, napište je níže.


Linux
  1. Linux Tee Command s příklady

  2. Příkaz linuxové hlavy s příklady

  3. JQ Command v Linuxu s příklady

  1. wc Linux Command s příklady

  2. Linux řazení příkazů s příklady

  3. Echo Command v Linuxu (s příklady)

  1. man Command v Linuxu s příklady

  2. Příkaz AWK v Linuxu s příklady

  3. Curl Command v Linuxu s příklady