Na ploše s Bashem mám použít ' & ', nohup, disown, nebo nějaká kombinace těchto tří k zahájení procesu a jeho úplnému spuštění?

Když spustím tyto čtyři příkazy na Xubuntu 16.04, buď lokálně, nebo přes ssh, zdá se, že všechny dělají přesně to samé:

export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally 
  1. gedit & 
  2. gedit & disown 
  3. nohup gedit 
  4. nohup gedit & disown 

nevím získejte rozdíl mezi gedit & a gedit & disown, protože pokud zabiju nadřazený terminál nebo se odhlásím z relace ssh, zdá se, že gedit je „odmítnut“ v obou případech.

Pokud jde o dva a tři, vidím jediný rozdíl v tom, že výstup příkazu je protokolován do samostatného souboru a bude i nadále protokolován do tohoto samostatného protokolu, i když původní relace prostředí, která způsobila proces bg, je zabita.

Pokud jde o tři a čtyři, stále čtu, že existuje technický rozdíl, ale vůbec nerozumím, proč byste raději jeden před druhým.

Který z nich mám použít? Viděl jsem všechny čtyři příkazy použité v tutoriálech a Q & As, a přes několik opravdu skvělých odpovědí popisujících technické rozdíly mezi nohup a disown se mi „nezdá, že bych dostal jednoznačné doporučení (kromě snad pro účely logování nebo pro kompatibilitu prostředí), které bych měl použít.

Komentáře

  • Potřebujete & ve všech případech, kdy chcete pokračovat v shellu (a program se nerozvětvuje sám). Možná nebudete potřebovat nohup u programů, které zavírají deskriptory souborů a disociují se (to. Gibt platí pro většinu aplikací GUI). Můžete použít disown po faktu (pokud zapomenete nohup) a jak bylo napsáno dříve, aplikace GUI to nepotřebují.

Odpovědět

Když potřebuji spustit skript, který poběží dlouhou dobu a budu ssh relace, chci buď:

  1. Úkol by měl pokračovat, i když se síť rozbije nebo když sbalím notebook a odejdu .

    a. Úkol může být dokončen bez interaktivního vstupu ode mě.

     nohup do_my_stuff & 

    b. Úkol může na mně něco potřebovat .

     man tmux history -w tmux do_my_stuff 
  2. Proces na pozadí nějakým způsobem vylepšuje moji aktuální relaci a měl by zemřít společně s relací. Rarita.

     enhance_my_session >>/tmp/enhance.$$.log 2>&1 & 
  3. Chci, aby ta věc náhodně vyplivla nějaké protokoly na mé relaci ssh. Počkej, co? Ne, to bych nikdy nechtěl. Děkuji vy disown.

  4. Další věc, kterou nikdy nechci: převést proces na plně odpojeného démona, ale vyhněte se automatickému spuštění při příštím spuštění. To bych nikdy nechtěl, protože nemohu předvídat, kdy se systém restartuje a kdo jej restartuje.

Odpovědět

Obvykle udělám následující:

  1. myprog & pokud chci jen spustit něco na pozadí z můj aktuální přihlašovací shell. To je pro mě 99% času přiměřené …

  2. nohup myprog > /my/path/output.txt & pokud něco spustím ze shellu, ale chci poté se odhlaste (možná když je úloha na pozadí stále spuštěna).

Odpovědět

Vy musí rozlišovat odchod z shellu od přerušení terminálu.

  1. Shell zabije všechny známé úlohy (ale ne jejich děti), když dostane signál o přerušení.
  2. Terminál zabije vše, pro co to byl řídící terminál.

Nejlepším řešením (na uživatelské úrovni) je IMHO obecně screen.

Pokud je váš úkol spíše systémový než uživatelský, můžete z něj udělat službu systemd, kterou spustíte ručně.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *