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
-
gedit &
-
gedit & disown
-
nohup gedit
-
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ď:
-
Ú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
-
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 &
-
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
. -
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í:
-
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é … -
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.
- Shell zabije všechny známé úlohy (ale ne jejich děti), když dostane signál o přerušení.
- 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ě.