To jest moje zrozumienie o wykorzystaniu &
, disown
oraz nohup
:
<command>
Uruchamia proces w aktualnym terminalabash
przykład w nowej (czyli proces jest wymieniony jakobash
pracy nowej istdin
,stdout
istderr
nadal są związane z terminal ); nie jest odporny na zawieszanie się ;<command> &
Uruchamia proces w aktualnym terminalabash
przykład w tle (to proces jest wymieniony jakobash
pracy tła istdin
,stdout
istderr
nadal są związane z terminal ); nie jest odporny na zawieszanie się ;<command> & disown
: Uruchamia proces w bieżącym terminalubash
przykład, w tle , ale proces jest odłączony odbash
listy „s zatrudnienia” (czyli proces nie jest wymieniony jakobash
pierwszego planu / tła pracy istdin
,stdout
istderr
nadal są zobowiązane do terminalu ); odporny na zawieszanie się ;nohup <command> & disown
: Uruchamia proces w bieżącym terminalubash
przykład, w tle , ale proces jest odłączony odbash
listy „s zatrudnienia” (czyli proces nie jest wymieniony jakobash
pierwszego planu / tła pracy istdin
,stdout
istderr
są nie nadal związany z terminalem ) ; odporny na zawieszanie się ;
Tak więc, oprócz nohup <command> & disown
blokowania stdin
i przekierowanie stdout
i stderr
aby nohup.out
domyś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?
bash
instancji nadrzędnej nie zabije procesuOdpowiedzi:
Twoje zrozumienie jest w zasadzie poprawne. Oba
disown
inohup
służą do opuszczenia działającej sesji powłoki bez zatrzymywania uruchomionych zadań. Kilka wyjaśnień:Nie ma powodu do ucieczki
nohup command & disown
,nohup
już ci to wyrzekniesz.nohup
jest zdefiniowany przez POSIX, podczas gdydisown
nie jest . Oznacza to, że podczas gdy wiele muszle (npbash
,zsh
,ksh
) mają go inni (na przykładtcsh
,csh
,dash
ish
) nie ma.disown
może być użyty po uruchomieniu polecenia, podczas gdynohup
musi 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 disown
iman 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:
disown -h
inohup
działa skutecznie?źródło
Nohup
idisown
nie są tym samym, a używanie obu poleceń NIE jest zbędne. Zobacz tę odpowiedź, aby uzyskać dokładny opisPunkty od pierwszego do trzeciego wydają się w porządku, choć
stdin, stdout and stderr are still bound to the terminal
nie jest to właściwe pojęcie.stdin
jest 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 terminal
jest w porządku.Masz
stdin, stdout and stderr are not still bound to the terminal
czwarty punkt, który nie jest właściwy, jak wspomniano w moim poprzednim akapicie. Również tutaj używasz/dev/null
jako pliku wejściowego docommand
, na przykład jeśli polecenie jestcat
, używasz go jakocat /dev/null
.Polecenie na piątym punkcie nie zostało poprawnie wprowadzone, użyte
nohup <command> & disown
, podczas gdy użycie jednegonohup
lubdisown
drugiego 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ć jakonohup <command> &
.źródło