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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.