Warum schließen einige Programme, die vom Terminal ausgeführt werden, mit '&', während andere dies nicht tun?

27

Ich habe mich nur gewundert, als ich zum Beispiel startete qtoxmit:

qtox &

Und dann Terminal schließen, qtoxschließt damit. Beim Laufen etherapemit:

sudo etherape &

Das Schließen des Terminals schließt Etherape nicht und verursacht auch keine Probleme. Und bei verschiedenen Anwendungen gibt es unterschiedliche Verhaltensweisen, manche schließen, wenn Terminal dies tut, andere nicht, wie kommt es? Warum schließen manche, andere nicht? Ich verwende Ubuntu GNOME 15.10 mit GNOME 3.18.

kos
quelle
1
Könnte es sein, dass Sie ein Terminal öffnen, qtox ausführen, das Terminal schließen, alles, was Sie !! Aber im zweiten Schritt öffnen Sie das Terminal, sudo führt etherape aus, jetzt schließen Sie das Terminal, aber sudo läuft weiter, bis sudo geschlossen wird?
Ken Mollerup
Nun, wenn Sie nicht qtoxbeenden möchten , wenn Sie das Terminal schließen, können Sie es immer mit ausführen nohup qtox &.
Terrance
@ Terrance: Nun, in dieser Frage habe ich speziell gefragt, warum, nicht wie ... Das wäre meine andere Frage ... :)
1
@ ParanoidPanda Ah, guter Punkt. Mein Fehler. =)
Terrance

Antworten:

36

Wenn Sie ein Terminal schließen, sendet das Terminal ein SIGHUP-Signal an die Shell. Die Shell sendet ihrerseits ein SIGHUP-Signal an alle untergeordneten Prozessgruppen, einschließlich Hintergrundprozessgruppen.

Wie jeder einzelne Prozess auf das Signal reagiert, hängt ganz vom Prozess ab: Wenn der Prozess keinen Handler für das Signal definiert und dem Kernel (über einen Syscall wie signal()oder sigaction()) mitteilt, dass er es verarbeiten möchte, wird der Kernel ausgeführt Der Standard-Handler für das Signal, der im Fall eines SIGHUP-Signals darin besteht, den Prozess zu beenden.

Wenn Sie jedoch einen Befehl mit ausführen sudo, wird die UID des sudoProzesses und seines untergeordneten Prozesses auf 0(root) festgelegt. Im Allgemeinen lehnt 0der Kernel das Signal ab , es sei denn, die UID des Prozesses, der das Signal sendet, ist (root) oder identisch mit der des Zielprozesses (dh, ein Prozess kann keine Signale an einen Prozess senden, der einem anderen Benutzer gehört, es sei denn, der Prozess Senden des Signals gehört root); Aus diesem Grund kann ein vom Benutzer ausgeführter Prozess wie die vom Terminal ausgeführte Bash-Instanz keinen sudoProzess SIGHUPEN , und das Schließen eines Terminals wirkt sich letztendlich nicht auf einen Prozess aus, mit dem begonnen wurde sudo.

kos
quelle
7
Und deshalb brauchen wir nohupvor den Befehlen, die mit SIGHUP enden :) Upgoated
Sergiy Kolodyazhnyy
9
Ich denke, es gibt nichts Magisches sudo. sudoFührt den Befehl nur als anderer Benutzer aus und Sie können kein Signal an die Prozesse anderer Benutzer senden. Sehen man 2 kill.
el.pescado
@ el.pescado Also ist es sudoeine Art armer Mann nohup?
Hagen von Eitzen
7
@HagenvonEitzen Wenn Sie wollen, aber ich würde sehr unterlassen Sie einen Befehl ausführen , die nicht benötigt sudomit sudofür seine nohupNebeneffekt betrachtet alle anderen Nachteile.
Kos
2
@ Serg brauchen wir nicht nohup, es erzeugt nicht benötigte nohup.outDateien danach. Verwende disownlieber den eingebauten Befehl.
Ruslan