Czy na komputerze z Bash powinienem używać ' & ', nohup, disown, lub jakąś kombinację tych trzech, aby rozpocząć proces i czy działa on całkowicie samodzielnie?

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 
  1. gedit & 
  2. gedit & disown 
  3. nohup gedit 
  4. 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ę:

  1. 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 
  2. 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 & 
  3. Chcę, aby program wypluł losowo kilka dzienników podczas mojej sesji ssh. Czekaj, co? Nie, nigdy bym tego nie chciał. Dziękuję you disown.

  4. 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:

  1. 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 …

  2. 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.

  1. Powłoka zabija wszystkie znane zadania (ale nie ich dzieci), kiedy otrzymuje sygnał przerwania.
  2. 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *