Pytając o to po długiej dyskusji ze współpracownikiem, naprawdę chciałbym tu wyjaśnić.
Uruchamiam proces w tle, dodając „ &
” do wiersza poleceń lub zatrzymując go CTRL-Z
i wznawiając go w tle za pomocą „ bg
”. Następnie wylogowuję się.
Co się dzieje?
Byliśmy całkiem pewni, że to powinien był zostać zabity przez SIGHUP, ale tak się nie stało; po ponownym zalogowaniu proces przebiegał pomyślnie i pstree
pokazał, że został „przyjęty” przez init
.
Czy to jest oczekiwane zachowanie?
Ale jeśli tak, jaki nohup
jest cel polecenia? Wygląda na to, że proces i tak nie zostanie zabity, z nim lub bez niego ...
Edytuj 1
Kilka dodatkowych szczegółów:
- Polecenie zostało uruchomione z sesji SSH, a nie z fizycznej konsoli.
- Komenda została uruchomiona bez
nohup
i / lub&
; następnie został zawieszonyCTRL-Z
i wznowiony w tle zbg
. - Sesja ssh nie spadła. Wystąpiło rzeczywiste wylogowanie (
exit
polecenie „ ”). - Proces był
scp
operacją kopiowania plików. - Po ponownym zalogowaniu
pstree
pokazał , że proces działa i że jest dzieckieminit
.
Edytuj 2
Uściślenie pytania: czy umieszczenie procesu w tle (za pomocą &
lub bg
) spowoduje, że będzie on ignorowany SIGHUP
, tak jak nohup
polecenie?
Edytuj 3
Próbowałem ręcznie wysłać SIGHUP
do scp
: wyszedł, więc zdecydowanie nie ignoruje sygnału.
Następnie spróbowałem ponownie uruchomić go, umieszczając go w tle i wylogowując się: został „adoptowany” przez init
i działał dalej, i znalazłem go tam podczas ponownego logowania.
Jestem teraz dość zaskoczony. Wygląda na to, że w ogóle nie SIGHUP
wysłano żadnego dodatkowego logowania.
źródło
1>/dev/null 2>&1
Na bash itp.?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
Zgadzam się z Warnerem i chcę tylko dodać, że możesz powstrzymać powłokę przed wysyłaniem SIGHUP za pomocą wbudowanego polecenia „disown”. Strona podręcznika bash zawiera dobry opis.
źródło
Możesz użyć polecenia nohup, aby uruchomić polecenie i przekierować dane wyjściowe do pliku wyjściowego nohup. Ze strony podręcznika nohup:
Inną opcją jest użycie polecenia screen . Zaletą korzystania z ekranu jest to, że możesz ponownie połączyć się z procesem później.
źródło
Gdy rozwidlisz proces w tle, nadal będzie to proces potomny wykonywanej przez powłokę.
Wszystkie procesy potomne działające w powłoce są wysyłane SIGHUP przy wyjściu. Wydajność różni się nieznacznie w zależności od dokładnej sytuacji, która jest szczegółowo opisana na stronie podręcznika bash. Inne pociski prawdopodobnie mają podobne opisy.
Apache i inne demony zwykle przeładowują konfigurację w SIGHUP. Narzędzia przestrzeni użytkownika często umierają. Wydajność aplikacji powiązana z sygnałami może być unikalna dla aplikacji.
źródło
Jaki był proces? Wydajność opisana we wcześniejszym poście 1 była dokładna.
Niektóre funkcje i procesy skryptowe mogą przechwytywać sygnały. podczas gdy pętle mogą uciec jak szalone.
Widzieć:
Sesja SSH spada - czy polecenie jest nadal wykonywane?
Edytuj 1 o 16:22
Z strony podręcznika bash:
Wstępne badania 1 pokazują, że OpenSSH prawdopodobnie ignoruje SIGHUP, może więcej sygnałów.
źródło
Jeśli nie uruchomiłeś polecenia za pomocą narzędzia takiego jak
screen
, to po zakończeniu sesji, podobnie jak wszystkie zadania / zadania związane z tą sesją.źródło
tail -f
w pliku tymczasowym. To na komputerze CentOS 7.1 za pomocą bash.