To kontynuacja tego pytania .
Przeprowadziłem jeszcze kilka testów; wygląda na to, że to naprawdę nie ma znaczenia, czy odbywa się to na konsoli fizycznej, czy przez SSH, nie dzieje się tak tylko w przypadku SCP; Testowałem to również z cat /dev/zero > /dev/null
. Zachowanie jest dokładnie takie samo:
- Rozpocznij proces w tle za pomocą
&
(lub umieść go w tle po rozpoczęciu używaniaCTRL-Z
ibg
); odbywa się to bez użycianohup
. - Wyloguj.
- Zaloguj się ponownie.
- Proces jest nadal obecny, przebiega szczęśliwie i jest teraz bezpośrednim dzieckiem
init
.
Mogę natychmiast potwierdzić zarówno SCP, jak i CAT, jeśli wyślę SIGHUP
; Przetestowałem to za pomocą kill -HUP
.
Wygląda więc na to, że SIGHUP nie jest wysyłany po wylogowaniu, przynajmniej do procesów w tle (z oczywistych powodów nie można go przetestować na pierwszym planie).
Zdarzyło mi się to początkowo z konsolą serwisową VMware ESX 3.5 (która jest oparta na RedHat), ale udało mi się to replikować dokładnie na CentOS 5.4.
Ponownie pojawia się pytanie: czy SIGHUP nie powinien być wysyłany do procesów, nawet jeśli działają one w tle, po wylogowaniu? Dlaczego tak się nie dzieje?
Edytować
Sprawdziłem strace
, zgodnie z odpowiedzią Kyle'a.
Tak jak się spodziewałem, proces nie otrzymuje żadnego sygnału podczas wylogowywania się z powłoki, w której został uruchomiony. Dzieje się tak zarówno podczas korzystania z konsoli serwera, jak i przez SSH.
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=10676, si_uid=3000090} --- rt_sigreturn() = -1 EINTR (Interrupted system call) rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=13944, si_uid=3000090} --- +++ killed by SIGHUP +++
huponexit
.Odpowiedzi:
Odpowiedź znaleziona.
W przypadku BASH zależy to od
huponexit
opcji powłoki, którą można wyświetlić i / lub ustawić za pomocą wbudowanegoshopt
polecenia.Wygląda na to, że ta opcja jest domyślnie wyłączona, przynajmniej w systemach opartych na RedHat.
Więcej informacji na stronie podręcznika BASH :
źródło
W moich testach zostanie wysłany SIGHUP:
Shell1:
Shell2:
Shell1 Znowu:
Shell2 Znowu :
Dlaczego nadal działa ?:
Zaawansowane programowanie w środowisku Unix autorstwa Stevensa omawia to w sekcji 9.10: Osierocone grupy procesów. Najbardziej odpowiednia sekcja to:
źródło
$ strace -e signal -p1705 Process 1705 attached --- stopped by SIGTSTP --- --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=791, si_uid=3000090} --- +++ killed by SIGTERM +++
Dziwne, zdecydowanie niezgodne z sekcją cytowaną przez Stevensa.Przeprowadziłem kilka testów przy użyciu CentOS 7.1 i bash. Uwaga: oznacza
huponexit
tooff
domyślnie i był wyłączony przez większość moich testów.Potrzebujesz,
nohup
kiedy zaczynasz zadanie w terminalu, ponieważ jeśli zamkniesz ten terminal bez wyjścia z powłoki , terminal wysyła bash sygnał SIGHUP do powłoki, który następnie wysyła go do wszystkich dzieci. Jeśli wyjdziesz z powłoki czysto - co oznacza, że zadanie musi już znajdować się w tle, aby można było pisaćexit
lub naciskać klawisz Control-D w wierszu polecenia - z bash żadne sygnały nie będą wysyłane do zadania w tle.Test:
Terminal 1
Terminal 2
(zamknij terminal 1, widoczny na terminalu 2):
Praca
doit.sh
:Uruchom go w tle w Terminalu 1:
Terminal 1
Znajdź go w Terminalu 2; zamknij Terminal 1 po kilku pętlach:
Terminal 2
Dane wyjściowe w terminalu 3:
Terminal 3
Jednak jeśli wyjdziesz
bash
, po prostu wyjdzie, nie wysyłając żadnego sygnału do dziecka. Terminal zakończy pracę, ponieważ nie ma już potomka, ale oczywiście nie ma nikogo, kto by HUP, ponieważ skorupa potomna już nie ma. ISIGINT
,SIG_BLOCK
iSIG_SETMASK
widzisz poniżej, są spowodowanesleep
powłoką.Terminal 1
Terminal 2
Zacisk 3, wyjście
Co ciekawe, nastawiłem
huponexit
się nashopt -s huponexit; shopt
(ten ostatni test do sprawdzenia), potem wykonałem ostatni test i znowu bash nie wysłał żadnego sygnału do procesu w tle . Jeszcze bardziej interstingly, jak widzieliśmy bash zrobił wysłać sygnał do procesu w tle po otrzymaniu go od terminalu, które zostały zamknięte w jego twarz. Wygląda na to, żehuponexit
nie miało to żadnego wpływu.Mam nadzieję, że to usunie wszelką tajemnicę lub zamieszanie dotyczące przynajmniej hashingu Basha, kiedy i jak wysyłany jest sygnał HUP. Przynajmniej moje testy były dla mnie całkowicie powtarzalne. Chciałbym wiedzieć, czy są jakieś inne ustawienia, które mogą wpływać na zachowanie basha.
I, jak zawsze, YSMV (Your Shell May Vary).
Dodatek 1
Kiedy uruchamiam powłokę jako
exec /bin/sh
, a następnie uruchamiam skrypt jako/bin/sh ./doit.sh &
, a następnie czysto wychodzę z powłoki, żadne sygnały nie są wysyłane do zadania w tle i kontynuuje działanie do końca.Dodatek 2
Kiedy uruchamiam powłokę jako
exec /bin/csh
, a następnie uruchamiam skrypt jako/bin/sh ./doit.sh &
, a następnie czysto wychodzę z powłoki, żadne sygnały nie są wysyłane do zadania w tle i kontynuuje działanie do końca.źródło
Używam csh, a procesy wylogowywania są kontynuowane po wylogowaniu.
źródło