Po pierwsze to pytanie jest powiązane, ale zdecydowanie nie to samo, co to bardzo miłe pytanie:
Różnica między nohup, disown i &
Chcę coś zrozumieć: kiedy to robię „&”, rozwidlam się, prawda?
Czy kiedykolwiek warto robić „nohup ...” czy jest to po prostu wystarczające?
Czy ktoś mógłby pokazać przypadek, w którym używałbyś „&” i nadal chciałby używać „nohup”?
nohup
robi. Którą część pomyliłeś?Odpowiedzi:
Po pierwsze, za każdym razem, gdy wykonujesz polecenie, powłoka rozwidla nowy proces, bez względu na to, czy go uruchomisz,
&
czy nie.&
oznacza tylko, że używasz go w tle.Uwaga: nie jest to zbyt dokładne. Niektóre polecenia, takie jak
cd
funkcje powłoki, zwykle nie rozwidlają nowego procesu.type cmd
zwykle powie ci, czycmd
jest to polecenie zewnętrzne, czy funkcja powłoki.type type
mówi ci, żetype
sama jest funkcją powłoki.nohup
to coś innego. Informuje nowy proces o zignorowaniuSIGHUP
. Jest to sygnał wysyłany przez jądro, gdy powłoka nadrzędna jest zamknięta.Aby odpowiedzieć na twoje pytanie, wykonaj następujące czynności:
emacs &
(domyślnie powinien działać w osobnym oknie X) .exit
.Zauważysz, że
emacs
okno zostało zabite, mimo że działa w tle. Jest to zachowanie domyślne inohup
służy ono właśnie do jego modyfikacji.Uruchamianie zadania w tle (z
&
lubbg
, założę się, że inne powłoki również mają inne składnie) jest funkcją powłoki, wynikającą ze zdolności współczesnych systemów do wielozadaniowości. Zamiast rozwidlone nową instancję powłoki dla każdego programu chcesz uruchomić, nowoczesne muszli (bash
,zsh
,ksh
, ...) będzie miał możliwość zarządzania listę programów (lub pracy ). Tylko jeden z nich może znajdować się na pierwszym planie , co oznacza, że skupia się na powłoce. Chciałbym, aby ktoś mógł bardziej rozwinąć różnice między procesem działającym na pierwszym planie a drugim w tle (głównym jest dostęp dostdin
/stdout
).W każdym razie nie wpływa to na reakcję procesu potomnego
SIGHUP
.nohup
robi.źródło
SIGHUP
do procesów potomnych, gdy sama powłoka odbieraSIGHUP
, a nie kiedy normalnie kończy działanie. bash ma opcję,huponexit
która powoduje, że wysyłaSIGHUP
do dzieci po wyjściu, ale domyślnie nie jest włączona. gnu.org/software/bash/manual/bashref.html#Signals&
i zamykając moją powłokę, uruchamiającexit
. Proces jest nadal uruchomiony. Wszelkie pomysły, dlaczego nie został zabity? A może coś tu brakuje?Czy to jest kiedykolwiek przydatne
nohup ... &
? Tak. Jeśli po prostu uruchomisz proces „w tle”&
, nowy proces nadal będzie miał członkostwo w „grupie procesów” oryginalnej powłoki. Jeśli ta powłoka lub grupa procesów otrzyma określone sygnały (na przykład SIGHUP), domyślnie wychodzą. Oznacza to, że jeśli uruchomisz proces z&
powłoki uruchomionej przez xterm, rxvt lub inny emulator terminalu okienkowego, po zamknięciu okna proces w tle zostanie ZWIĘKSZONY. Większość swobodnie napisanego kodu nie obsługuje SIGHUP, a zatem kończy działanie.Jeśli to zrobisz
nohup ... &
,nohup
polecenie ustawi SIGHUP na ignorowane, a następnie wykona polecenie. To nowo wykonane polecenie zachowujenohup
konfigurację maski sygnału , chyba że polecenie samo obsługuje obsługę sygnału. Jeśli zamkniesz xterm, rxvt lub cokolwiek, jądro dostarcza SIGHUP do procesu polecenia, który jest ignorowany. Nadal działa.Wykonanie
nohup
polecenia pozwala na kontynuowanie działania po zamknięciu xterm lub wylogowaniu.źródło
&
znohup
powoduje, że polecenie działa w pewnych przypadkach, w których użycie tylkonohup
nie byłoby? To wydaje się kolidować z odpowiedzią tutaj: unix.stackexchange.com/a/288064/1822nohup
Robi pewne rzeczy przedexec()
wywołania systemowego, aby rozwidlony proces ignorować pewne sygnały. Tak więc „&” pozwoli na uruchomienie polecenia w pewnych okolicznościach, których zwykły starynohup
nie zrobiłby. Jak zamknięcie xtermu związanego z powłoką, która zrobiła nohup, lub wylogowanie.jeśli uruchomisz program w tle (z przyrostkiem &) w systemie operacyjnym Linux i wylogujesz się, nawet po tym będzie on działał: wypróbuj:
Po ponownym zalogowaniu sprawdź liczbę wierszy w pliku wyjściowym,
ping_result
który będzie się zwiększał, oznacza to, że nadal działa, ale powiedziano mu, że zostanie zamknięty. jakie jest użycienohup
polecenia.inny scenariusz ==> jak podano powyżej dla
nohup emac &
->, który powinien nadalemac
działać po wylogowaniu z systemu, ale nie pokazuje się po ponownym zalogowaniu.źródło