Dlaczego niektóre programy uruchamiane z terminala za pomocą „&” zamykają się, gdy robi to Terminal, a inne nie?

27

Zastanawiałem się, na przykład, kiedy uruchamiam qtoxz:

qtox &

A następnie zamknij Terminal, qtoxzamyka się nim. Jednak podczas etherapekorzystania z:

sudo etherape &

Zamknięcie terminalu nie zamyka się ani nie powoduje żadnych problemów w Etherape. A wśród różnych aplikacji jest inne zachowanie, niektóre zamykają się, gdy robi to Terminal, inne nie, dlaczego? Dlaczego jedni się zamykają, a inni nie? Używam Ubuntu GNOME 15.10 z GNOME 3.18.

kos
źródło
1
Czy to możliwe, że otwierasz terminal, uruchamiasz qtox, zamykasz terminal, wszystko !! Ale po drugie: otwórz terminal, sudo uruchamia etherape, teraz zamykasz terminal, ale sudo działa aż do zamknięcia sudo?
Ken Mollerup,
Cóż, jeśli nie chcesz qtoxwychodzić po zamknięciu terminala, zawsze możesz go uruchomić nohup qtox &.
Terrance
@Terrance: Cóż, w tym pytaniu pytałem konkretnie dlaczego, a nie jak ... To byłoby moje inne pytanie ... :)
1
@ParanoidPanda Ah, dobra uwaga. Mój błąd. =)
Terrance

Odpowiedzi:

36

Kiedy zamykasz terminal, terminal wysyła sygnał SIGHUP do powłoki; powłoka z kolei wysyła sygnał SIGHUP do wszystkich swoich potomnych grup procesów, które obejmują grupy procesów w tle;

To, jak każdy pojedynczy proces zareaguje na sygnał, zależy wyłącznie od procesu: jeśli proces nie zdefiniował procedury obsługi sygnału i nie poinformował jądra (za pomocą jakiegoś syscall, takiego jak signal()lub sigaction()), że chce go obsłużyć, jądro wykonuje domyślna procedura obsługi sygnału, która w przypadku sygnału SIGHUP polega na zakończeniu procesu.

Jednak po uruchomieniu polecenia za sudopomocą UID sudoprocesu i jego procesu potomnego ustawiane jest na 0(root); ogólnie, chyba że identyfikator UID procesu wysyłającego sygnał jest 0(root) lub taki sam jak proces docelowy, jądro odrzuca sygnał (tj .: proces nie może wysyłać sygnałów do procesu należącego do innego użytkownika, chyba że proces wysyłanie sygnału należy do roota; dlatego proces uruchamiany przez użytkownika, taki jak instancja Bash uruchamiana przez terminal, nie może ZATRZYMAĆ sudoprocesu, a ostatecznie zamknięcie terminala nie wpływa na proces rozpoczęty sudo.

kos
źródło
7
I dlatego potrzebujemy nohuptych poleceń, które zamykają SIGHUP :) Upgoated
Sergiy Kolodyazhnyy
9
Myślę, że nie ma w tym nic magicznego sudo. sudopo prostu uruchamia polecenie jako inny użytkownik i nie można wysłać sygnału do procesów innych użytkowników. Zobaczyć man 2 kill.
el.pescado
@ el.pescado Więc jest sudojakiś biedny człowiek nohup?
Hagen von Eitzen
7
@HagenvonEitzen Jeśli chcesz, ale zdecydowanie powstrzymałbym się od wykonania polecenia, które nie wymagałoby tego sudoze sudowzględu na nohupefekt uboczny, biorąc pod uwagę wszystkie inne wady.
kos
2
@Serg nie potrzebujemy nohup, tworzy nohup.outpo nim niepotrzebne pliki. Zamiast tego użyj disownwbudowanego polecenia.
Ruslan