it-swarm-eu.dev

Rozdíl mezi Nohupem, disown a &

Jaké jsou rozdíly mezi

$ Nohup foo

a

$ foo &

a

$ foo & 
$ disown
600
lesmana

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:

  • Je vytvořen proces spuštěný foo.
  • Proces zdědí stdin, stdout a stderr od Shell. Proto je také připojen ke stejnému terminálu.
  • Pokud Shell přijme SIGHUP, odešle také procesu SIGHUP (což obvykle způsobí ukončení procesu).
  • Jinak Shell čeká (je blokován), dokud se proces neskončí.

Nyní se podívejme, co se stane, pokud umístíte proces na pozadí, tj. Zadejte foo &:

  • Je vytvořen proces spuštěný foo.
  • Proces zdědí stdout/stderr od Shell (takže stále zapisuje na terminál).
  • Proces v zásadě také zdědí stdin, ale jakmile se snaží číst od stdin, je zastaven.
  • Je zařazen do seznamu úloh na pozadí, které Shell spravuje, což znamená zejména:
    • Je uveden s jobs a lze k němu přistupovat pomocí %n (kde n je číslo úlohy).
    • Pomocí 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).
    • Pokud Shell přijal 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:

  • Zavře standardní vstup (program nebude nebude schopen číst žádný vstup, i když je spuštěn v popředí. Není zastaven, ale bude obdržíte kód chyby nebo EOF).
  • Přesměruje standardní výstup a standardní chybu do souboru 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í.
  • Zabraňuje procesu přijímat 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é).
595
celtschk

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í

174
Michael Mrozek

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í

Nohup .. &

#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I nevidím podhled logy/stisknutím Ctrl-C podhled se zastaví

& odmítnout

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

I viz podhled logy/stisknutím Ctrl-C soffice zastaví

setid .. &

#!/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-C
Nohup with & disown na konci: nezobrazuje protokoly/soffice se zastaví Ctrl-C

9
Marinos An