Jaké jsou rozdíly mezi
$ Nohup foo
a
$ foo &
a
$ foo &
$ disown
Podívejme se nejprve, co se stane, když se program spustí z interaktivního prostředí (připojeného k terminálu) bez &
(a bez přesměrování). Předpokládejme tedy, že jste právě zadali foo
:
foo
.SIGHUP
, odešle také procesu SIGHUP
(což obvykle způsobí ukončení procesu).Nyní se podívejme, co se stane, pokud umístíte proces na pozadí, tj. Zadejte foo &
:
foo
.jobs
a lze k němu přistupovat pomocí %n
(kde n
je číslo úlohy).fg
ji lze převést na popředí. V takovém případě pokračuje, jako byste nepoužili &
(a pokud bylo zastaveno kvůli pokusu o čtení ze standardního vstupu, může nyní pokračovat ve čtení z terminálu).SIGHUP
, také odešle do procesu SIGHUP
. V závislosti na prostředí a případně na možnostech nastavených pro prostředí, při ukončení prostředí také odešle do procesu SIGHUP
.Nyní disown
odstraní úlohu ze seznamu úloh Shell, takže všechny výše uvedené body se už nepoužijí (včetně procesu, který Shell odesílá SIGHUP
). Všimněte si však, že stále je připojen k terminálu, takže pokud je terminál zničen (což se může stát, pokud to byl pty, jako ty vytvořené xterm
nebo ssh
a řídící program je ukončen uzavřením xterm nebo ukončením spojení SSH ), programem selže, jakmile se pokusí číst ze standardního vstupu nebo zapisovat na standardní výstup.
Na druhé straně Nohup
je efektivně oddělit proces od terminálu:
EOF
).Nohup.out
, takže program selže při zápisu na standardní výstup, pokud terminál selže, takže cokoli, co proces zapíše, se neztratí.SIGHUP
(tedy název).Všimněte si, že Nohup
neodstraní proces z řízení úlohy Shell a také jej nevloží na pozadí (ale protože úloha v popředí Nohup
je víceméně zbytečná, obvykle ji umístíte na pozadí pomocí &
). Například, na rozdíl od disown
, Shell vám stále řekne, kdy je úloha Nohup dokončena (pokud ovšem Shell není samozřejmě dříve ukončen).
Takže shrnout:
&
umístí úlohu na pozadí, to znamená, že ji zablokuje při pokusu o čtení vstupu a způsobí, že Shell nečeká na dokončení.disown
odstraní proces z řízení úlohy Shell, ale stále jej ponechává připojený k terminálu. Jedním z výsledků je, že to Shell neposílá SIGHUP
. Je zřejmé, že lze použít pouze na úlohy na pozadí, protože je nelze zadat, když je spuštěna úloha v popředí.Nohup
odpojí proces od terminálu, přesměruje jeho výstup na Nohup.out
a chrání jej před SIGHUP
. Jedním z efektů (pojmenování) je, že tento proces neobdrží žádné odeslané SIGHUP
. Je zcela nezávislý na řízení úloh a lze jej v zásadě použít také pro práce v popředí (i když to není příliš užitečné).Použitím &
způsobí, že se program spustí na pozadí, takže místo blokování dostanete nový příkaz Shell Prompt, dokud program neskončí. Nohup
a disown
jsou do značné míry nesouvisející; potlačují signály SIGHUP (hangup), takže program není automaticky zavřen, když je ovládací terminál uzavřen. Nohup
to provede při prvním spuštění úlohy. Pokud při zahájení úlohy Nohup
neprovedete, můžete pomocí funkce disown
upravit spuštěnou úlohu; bez argumentů modifikuje aktuální úlohu, která byla právě na pozadí
Zde je moje zkušenost se pokusem spustit soffice na pozadí, po nekonečném příkazu (např. tail
). Pro tento příklad použiji sleep 100
.
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I viz podhled logy/stisknutím Ctrl-C soffice zastaví
#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I nevidím podhled logy/stisknutím Ctrl-C podhled se zastaví
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100
I viz podhled logy/stisknutím Ctrl-C soffice zastaví
#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
I viz podhled logy/stisknutím Ctrl-C soffice NEZAHRAJÍ
Chcete-li ušetřit místo:Nohup setsid ..
: Nezobrazuje protokoly/podhledy NENÍ ZASTAVEN Ctrl-CNohup
with & disown
na konci: nezobrazuje protokoly/soffice se zastaví Ctrl-C