Jakie są różnice między
$ nohup foo
i
$ foo &
i
$ foo &
$ disown
shell
nohup
job-control
disown
lesmana
źródło
źródło
foo &!
coś, co powinno być równoznaczne z odrzuceniem go od samego początku.foo & disown
wyprzeć się natychmiast.setsid
, i jak odnosi się dodisown
inohup
Odpowiedzi:
Przyjrzyjmy się najpierw, co się stanie, jeśli program zostanie uruchomiony z interaktywnej powłoki (podłączonej do terminala) bez
&
(i bez przekierowania). Załóżmy więc, że właśnie wpisałeśfoo
:foo
został utworzony.SIGHUP
, wysyła również aSIGHUP
do procesu (co normalnie powoduje zakończenie procesu).Teraz spójrzmy, co się stanie, jeśli umieścisz proces w tle, czyli wpisz
foo &
:foo
został utworzony.jobs
i można uzyskać do niego dostęp za pomocą%n
(gdzien
jest numer zadania).fg
, w którym to przypadku jest kontynuowane, jakbyś nie używał&
go (a jeśli został zatrzymany z powodu próby odczytu ze standardowego wejścia, może teraz kontynuować czytanie z terminala).SIGHUP
, wysyła również aSIGHUP
do procesu. W zależności od powłoki i ewentualnie opcji ustawionych dla powłoki, po zakończeniu powłoki wyśle ona równieżSIGHUP
do procesu.Teraz
disown
usuwa zadanie z listy zadań powłoki, więc wszystkie powyższe podpunkty nie mają już zastosowania (w tym proces wysyłanySIGHUP
przez powłokę). Należy jednak pamiętać, że nadal jest podłączony do terminala, więc jeśli terminal zostanie zniszczony (co może się zdarzyć, jeśli był to pty, taki jak utworzony przezxterm
lubssh
, a program sterujący zostanie zakończony, zamykając xterm lub kończąc połączenie SSH ) , program zawiedzie, gdy tylko spróbuje odczytać ze standardowego wejścia lub zapisać na standardowe wyjście.Z
nohup
drugiej strony chodzi o skuteczne oddzielenie procesu od terminala:EOF
).nohup.out
, więc program nie zawiedzie w przypadku zapisu na standardowe wyjście, jeśli terminal ulegnie awarii, więc wszystko, co pisze proces, nie zostanie utracone.SIGHUP
(stąd nazwy).Zauważ, że
nohup
nie nie wyjąć spod kontroli procesu pracy przez powłokę, a także nie umieścić go w tle (ale ponieważ pierwszy plannohup
praca jest mniej lub bardziej bezużyteczny, którą zazwyczaj umieścić go w tle przy użyciu&
). Na przykład, inaczej niż w przypadkudisown
, powłoka nadal powie ci, kiedy zadanie nohup zakończy się (chyba że powłoka została wcześniej zakończona, oczywiście).Podsumowując:
&
umieszcza zadanie w tle, co oznacza, że blokuje ono próbę odczytu danych wejściowych i sprawia, że powłoka nie czeka na zakończenie.disown
usuwa proces z kontroli zadań powłoki, ale nadal pozostawia ją podłączoną do terminala. Jednym z rezultatów jest to, że powłoka nie wyśle jejSIGHUP
. Oczywiście można go zastosować tylko do zadań w tle, ponieważ nie można go wprowadzić, gdy uruchomione jest zadanie pierwszego planu.nohup
odłącza proces od terminala, przekierowuje jego wyjścienohup.out
i osłania goSIGHUP
. Jednym z efektów (nazewnictwa) jest to, że proces nie otrzyma żadnego wysłanegoSIGHUP
. Jest całkowicie niezależny od kontroli zadań i może być zasadniczo stosowany również do zadań na pierwszym planie (choć nie jest to bardzo przydatne).źródło
nohup
sam nie ratuje procesu Google-Chrome przed zamknięciem, kiedy terminal, z którego został uruchomiony, jest zamknięty ?disown %1
idisown -h %1
? Drugi zachowa się jako normalne zadanie (ale ignoruje sygnał HUP), dopóki terminal nie wyjdzie?(foo&)
Użycie
&
powoduje, że program działa w tle, więc zamiast blokowania do momentu zakończenia programu pojawi się nowy monit powłoki.nohup
idisown
są w dużej mierze niezwiązane; tłumią sygnały SIGHUP (rozłączenia), aby program nie był automatycznie zabijany po zamknięciu terminala sterującego.nohup
robi to, gdy praca zaczyna się po raz pierwszy. Jeśli nienohup
rozpoczniesz zadania, możeszdisown
zmodyfikować uruchomione zadanie; bez argumentów modyfikuje bieżące zadanie, które właśnie zostało w tleźródło
nohup
idisown
oba można tłumićSIGHUP
, ale na różne sposoby.nohup
powoduje, że program początkowo ignoruje sygnał (program może to zmienić).nohup
Próbuje również tak ustawić program, aby nie miał terminalu sterującego, aby nie był wysyłanySIGHUP
przez jądro, gdy terminal jest zamknięty.disown
jest czysto wewnętrzny względem powłoki; powoduje, że powłoka nie wysyłaSIGHUP
po zakończeniu.disown
usuwania zadania z listy zadań. Jeśli nie określisz opcji, spowoduje to usunięcie jej z listy zadań. Jednakże , jeśli podasz-h
opcję, każdy jobspec jest nie usunięty z tabeli. Zamiast tego sprawia, żeSIGHUP
nie jest wysyłany do zadania, jeśli powłoka otrzyma polecenieSIGHUP
.&
nie daje terminal, odłączastdin
od procesu i powoduje go uruchomić w tle, ale obastdout
istderr
nadal jest załączony do aktualnej konsoli. Oznacza to, że możesz pomieszać tekst z różnych programów, co może być dość irytujące, jeśli to zrobiszgimp &
i pojawi się wiele błędów GTK + podczas próby użycia tego tty do czegoś innego.Oto moje doświadczenie w próbie uruchomienia biura w tle, po wykonaniu polecenia nie kończącego (np
tail
.). W tym przykładzie użyjęsleep 100
.I
nohup .. i
i wyrzucić
setsid .. i
Aby zaoszczędzić miejsce::
nohup setsid ..
nie wyświetla dzienników / poddasza NIECtrlC ZATRZYMUJE się na -nohup
z& disown
na końcu: nie pokazuje dzienników / poddasza zatrzymuje się Ctrl-Cźródło
nohup ⟨command⟩ & disown
stworzony proces nie kończy się naCtrl+C
.soffice
?soffice
polecenie wydaje się mieć coś innego. Rozważyłem więc dodanie go tutaj jako wyjątku od reguły. np. przy użyciu:nohup .. &
naciśnięcieCtrl-c
normalnie nie powoduje zatrzymania polecenia, alesoffice
powoduje to. Czekam, aż ktoś podejdzie do tego i wyjaśni, dlaczego tak się dzieje z biurowcem :)nohup soffice &
i nacisnąłemCtrl+C
. Nic się nie stało, zgodnie z oczekiwaniami.