Różnice między „<poleceniem> i odrzuceniem” a „nohup <poleceniem> i odrzuceniem”

41

To jest moje zrozumienie o wykorzystaniu &, disownoraz nohup:

  • <command>Uruchamia proces w aktualnym terminala bashprzykład w nowej (czyli proces jest wymieniony jako bashpracy nowej i stdin, stdouti stderrnadal są związane z terminal ); nie jest odporny na zawieszanie się ;
  • <command> &Uruchamia proces w aktualnym terminala bashprzykład w tle (to proces jest wymieniony jako bashpracy tła i stdin, stdouti stderrnadal są związane z terminal ); nie jest odporny na zawieszanie się ;
  • <command> & disown: Uruchamia proces w bieżącym terminalu bashprzykład, w tle , ale proces jest odłączony od bashlisty „s zatrudnienia” (czyli proces nie jest wymieniony jako bashpierwszego planu / tła pracy i stdin, stdouti stderrnadal są zobowiązane do terminalu ); odporny na zawieszanie się ;
  • nohup <command> & disown: Uruchamia proces w bieżącym terminalu bashprzykład, w tle , ale proces jest odłączony od bashlisty „s zatrudnienia” (czyli proces nie jest wymieniony jako bashpierwszego planu / tła pracy i stdin, stdouti stderrnie nadal związany z terminalem ) ; odporny na zawieszanie się ;

Tak więc, oprócz nohup <command> & disownblokowania stdini przekierowanie stdouti stderraby nohup.outdomyślnie, wydaje mi się, może to być uznane za całkowicie równoważne <command> & disown.

Czy powyższe wszystko jest poprawne? Jakieś nieporozumienie?

kos
źródło
1
Co rozumiesz przez „odporny na zawieszanie się” i „niewrażliwy na zawieszanie się”?
chaos
2
@chaos Mam na myśli, że zakończenie / zabicie bashinstancji nadrzędnej nie zabije procesu
Kos

Odpowiedzi:

32

Twoje zrozumienie jest w zasadzie poprawne. Oba disowni nohupsłużą do opuszczenia działającej sesji powłoki bez zatrzymywania uruchomionych zadań. Kilka wyjaśnień:

  • Nie ma powodu do ucieczki nohup command & disown, nohupjuż ci to wyrzekniesz.

  • nohupjest zdefiniowany przez POSIX, podczas gdy disown nie jest . Oznacza to, że podczas gdy wiele muszle (np bash, zsh, ksh) mają go inni (na przykład tcsh, csh, dashi sh) nie ma.

  • disownmoże być użyty po uruchomieniu polecenia, podczas gdy nohupmusi być użyty wcześniej.

O ile wiem, faktyczny efekt obu poleceń jest taki sam. Każdy z nich ma cechy, których innym brakuje (patrz help disowni man nohup), ale ich podstawowa funkcja jest taka sama, tak.

Aby uzyskać bardziej szczegółowe omówienie tych narzędzi i różnic między nimi, zapoznaj się z odpowiedziami tutaj:

terdon
źródło
11
Nohupi disownnie są tym samym, a używanie obu poleceń NIE jest zbędne. Zobacz tę odpowiedź, aby uzyskać dokładny opis
nota
7

Punkty od pierwszego do trzeciego wydają się w porządku, choć stdin, stdout and stderr are still bound to the terminalnie jest to właściwe pojęcie. stdinjest zawsze związany z terminalem w tym sensie, że zawsze wprowadzasz nazwę pliku do polecenia za pomocą terminala lub w sposób wykorzystujący terminal. stdout and stderr are still bound to the terminaljest w porządku.

Masz stdin, stdout and stderr are not still bound to the terminalczwarty punkt, który nie jest właściwy, jak wspomniano w moim poprzednim akapicie. Również tutaj używasz /dev/nulljako pliku wejściowego do command, na przykład jeśli polecenie jest cat, używasz go jako cat /dev/null.

Polecenie na piątym punkcie nie zostało poprawnie wprowadzone, użyte nohup <command> & disown, podczas gdy użycie jednego nohuplub disowndrugiego nie jest potrzebne. Ich cele są takie same (aby je zignorować SIGHUP), ale działają w nieco inny sposób. Tak więc polecenie można uprościć jako nohup <command> &.

heemayl
źródło