Kiedy uruchamiam te cztery polecenia na Xubuntu 16.04, lokalnie lub przez ssh, wszystkie wydają się robić dokładnie to samo:
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
Nie uzyskać różnicę między gedit &
i gedit & disown
, ponieważ jeśli zabiję terminal nadrzędny lub wyloguję się z sesji ssh, wydaje się, że gedit jest „wyrzeczony” w obu przypadkach.
Jeśli chodzi o dwa i trzy, jedyną różnicą, jaką widzę, jest to, że dane wyjściowe polecenia są rejestrowane w oddzielnym pliku i nadal będą rejestrowane w tym osobnym dzienniku, nawet oryginalna sesja powłoki, która zapoczątkowała proces bg, zostaje zabita.
Jeśli chodzi o trzy i cztery, to czytam dalej, że istnieje różnica techniczna, ale w ogóle nie mogę zrozumieć, dlaczego wolałbyś jedną od drugiej.
Którego powinienem użyć? Widziałem wszystkie cztery polecenia używane w samouczkach i Q & As, i pomimo kilku naprawdę świetnych odpowiedzi opisujących techniczne różnice między nohup i disown, nie mogę uzyskać jasnej rekomendacji (z wyjątkiem być może celów logowania lub zgodności powłoki), dla której powinienem użyć.
Komentarze
- Potrzebujesz & we wszystkich przypadkach, w których chcesz kontynuować w powłoce (a program sam się nie rozwidla). Możesz nie potrzebować nohup dla programów, które zamykają deskryptory plików i odłączają się (to. Gibt jest prawdą dla większości aplikacji GUI). Możesz użyć disown po fakcie (jeśli zapomnisz nohup) i jak napisano wcześniej, aplikacje GUI go nie potrzebują.
Odpowiedz
Kiedy potrzebuję uruchomić skrypt, który będzie działał przez długi czas , a ja jestem na sesję ssh
, chcę:
-
Zadanie powinno być kontynuowane nawet w przypadku zerwania sieci lub spakowania laptopa i wyjazdu .
a. Zadanie może zakończyć się bez mojej interakcji.
nohup do_my_stuff &
b. Zadanie może wymagać czegoś ode mnie na stdin .
man tmux history -w tmux do_my_stuff
-
Proces w tle w jakiś sposób ulepsza moją obecną sesję i powinien umrzeć wraz z sesją. Rzadkość.
enhance_my_session >>/tmp/enhance.$$.log 2>&1 &
-
Chcę, aby program wypluł losowo kilka dzienników podczas mojej sesji ssh. Czekaj, co? Nie, nigdy bym tego nie chciał. Dziękuję you
disown
. -
Kolejna rzecz, której nigdy nie chcę: konwersja proces do całkowicie odłączonego demona, ale unikaj automatycznego uruchamiania go przy następnym uruchomieniu. Nigdy bym tego nie chciał, ponieważ nie mogę przewidzieć, kiedy system się zrestartuje i kto będzie go restartował.
Odpowiedź
Zwykle wykonuję tylko następujące czynności:
-
myprog &
, jeśli chcę tylko uruchomić coś w tle z moja obecna powłoka logowania. Jest to dla mnie wystarczające w 99% przypadków … -
nohup myprog > /my/path/output.txt &
jeśli zaczynam coś z powłoki, ale chcę wyloguj się później (być może gdy zadanie w tle jest nadal uruchomione).
Odpowiedź
Ty musi odróżniać wyjście z powłoki od przerwania działania terminala.
- Powłoka zabija wszystkie znane zadania (ale nie ich dzieci), kiedy otrzymuje sygnał przerwania.
- Terminal zabija wszystko, dla czego był terminalem sterującym.
Ogólnie najlepszym rozwiązaniem (na poziomie użytkownika) IMHO jest screen
.
Jeśli twoje zadanie jest raczej związane z systemem niż z użytkownikami, możesz uczynić je usługą systemową zamiast uruchamiać ją ręcznie.