Was sind "Sitzungsleiter" in "ps"?

78

Was sind Sitzungsleiter, bei ps -ddenen alle Prozesse außer den Sitzungsleitern ausgewählt werden?

da ich bin
quelle

Antworten:

84

Unter Linux sind jedem Prozess mehrere IDs zugeordnet, darunter:

  • Prozess-ID (PID)

    Dies ist eine beliebige Nummer, die den Prozess identifiziert. Jeder Prozess hat eine eindeutige ID. Nachdem der Prozess beendet wurde und der übergeordnete Prozess den Beendigungsstatus abgerufen hat, wird die Prozess-ID für die Wiederverwendung durch einen neuen Prozess freigegeben.

  • Übergeordnete Prozess-ID (PPID)

    Dies ist nur die PID des Prozesses, der den betreffenden Prozess gestartet hat.

  • Prozessgruppen-ID (PGID)

    Dies ist nur die PID des Prozessgruppenleiters. Wenn PID == PGID, dann ist dieser Prozess ein Prozessgruppenleiter.

  • Sitzungs-ID (SID)

    Dies ist nur die PID des Sitzungsleiters. Wenn PID == SID, dann ist dieser Prozess ein Sitzungsleiter.

Sitzungen und Prozessgruppen sind nur Möglichkeiten, eine Reihe von verwandten Prozessen als Einheit zu behandeln. Alle Mitglieder einer Prozessgruppe gehören immer zu derselben Sitzung, eine Sitzung kann jedoch mehrere Prozessgruppen enthalten.

Normalerweise ist eine Shell ein Sitzungsleiter, und jede von dieser Shell ausgeführte Pipeline ist eine Prozessgruppe. Dies soll es einfach machen, die Kinder einer Muschel zu töten, wenn sie herauskommt. (Siehe Ausgang (3) für die Details.)

Ich glaube nicht, dass es einen speziellen Begriff für ein Mitglied einer Sitzung oder Prozessgruppe gibt, das nicht der Anführer ist.

cjm
quelle
5
Hinweis: Verwenden Sie ps xao pid,ppid,pgid,sid,commdiese Option, um diese IDs anzuzeigen.
Mike R
1
Warum geben die Leute nicht mehr solcher anschaulichen, auf realen Vergleichen basierenden Antworten
?
24

Ein Sitzungsleiter ist ein Prozess, bei dem die Sitzungs-ID == die Prozess-ID ist. Das klingt erfunden, aber die Sitzungs-ID wird von untergeordneten Prozessen geerbt. Einige Operationen in UNIX / Linux werden in Prozesssitzungen ausgeführt, z. B. das Negieren der Prozess-ID, wenn sie an den Systemaufruf oder Befehl kill gesendet werden. Die häufigste Verwendung hierfür ist das Abmelden von einer Shell. Das Betriebssystem kill -HUP -$$sendet ein SIGHUP-Signal (Auflegen) an alle Prozesse mit derselben Sitzungs-ID wie die Shell. Wenn Sie einen Prozess ablehnen, wird die Sitzungs-ID des Prozesses von der Shell aus geändert, sodass er nicht auf das Aufhängesignal reagiert. Dies ist ein Teil des Prozesses, um ein Daemon-Prozess zu werden.

Die meisten Prozesse, die vom Fenstermanager / der grafischen Umgebung aufgerufen werden, haben dieselbe Sitzungs-ID wie eines der Startprogramme. Auf diese Weise kann das kill -HUP -$$Betriebssystem für alle Programme den gleichen Vorgang ausführen : z. B. für Ihren Browser, Musik-Player, Libreoffice, IM-Client usw. Dies sind die Prozesse, die keine Sitzungsleiter sind.

Arcege
quelle
Bitte haben Sie nichts dagegen, aber ich könnte etwas mehr Klarheit brauchen. - Der Sitzungsleiter ist einer, wie heißen die anderen und wie sind sie (Verhalten, was machen sie anders als der Sitzungsleiter)?
its_me
Ich glaube, sie heißen Mitglied der Sitzung.
Arcege
Ich mag Ihre Erklärung, aber ich vermisse immer noch einen Punkt: IIUC, zu jeder Zeit ist jeder Prozess, den ich gestartet habe, ein Kind der Shell, mit der ich mich angemeldet habe (es sei denn, ich habe es natürlich abgelehnt). Warum sollte OS nicht einfach den Prozessbaum durchgehen und alle Geschwister dieses Prozesses und ihre Geschwister töten? (Eigentlich habe ich immer gedacht, dass das so ist ... bis heute: D) Was ist also der Grund, warum Sitzungen stattdessen verwendet werden?
Alois Mahdal
Es muss nicht möglich sein, festzustellen, wann ein Prozess nicht mehr Teil der ursprünglichen Sitzung ist (z. B. Anmeldeshell oder Daemon). Ein Gedanke könnte darin bestehen, die PPID (übergeordnete PID) automatisch in 1 zu ändern, aber das bricht den Prozessbaum. Eine neue Sitzungs-ID erstellt eine Gruppe, die zusammen ein Signal senden kann. Ein Beispiel hierfür ist die GUI, die Firefox als separate Sitzung startet. Wenn Sie dann die Taste [X] drücken, senden Sie ein Signal an die Firefox-Sitzung und ihre untergeordneten Elemente, der Fenstermanager ist jedoch nicht betroffen. Dies ist bei reinen PPID-PID-Beziehungen nicht möglich.
Arcege
Wenn die GUI stirbt, kann der gesamte Prozessbaum, nicht die Sitzungsgruppe, das Signal erhalten. Zwei verschiedene gewünschte Verhaltensweisen: Beenden einer 'App' (Beenden von Firefox und seinen Plugins) und Beenden aller untergeordneten Prozesse (Beenden einer GUI). Ähnliche Arbeiten mit Emacs und Chrom, erwarte ich.
Arcege
13

Ich dachte, ich wüsste die Antwort darauf, aber ich habe ein C-Programm geschrieben, um das herauszufinden.

#include <stdio.h>
#include <unistd.h>

int
main(int ac, char **av)
{
        pid_t sid, mypid, pgid, gid;

        mypid = getpid();
        sid = getsid(0);
        pgid = getpgid(0);
        gid = getpgrp();

        printf("PID %d\n", mypid);
        printf("process group ID of session leader: %d\n", sid);
        printf("process group ID: %d\n", pgid);
        printf("process group ID: %d\n", gid);

        if (!fork())
        {
                mypid = getpid();
                sid = getsid(0);
                pgid = getpgid(0);
                gid = getpgrp();

                printf("child PID %d\n", mypid);
                printf("process group ID of session leader: %d\n", sid);
                printf("process group ID: %d\n", pgid);
                printf("process group ID: %d\n", gid);

                _exit(0);
        }

        return 0;
}

Ich habe es mit cc -g -o sid sid.c ein paar verschiedenen Methoden kompiliert , um zu sehen, was passiert:

./sid
nohup ./sid > sid.out
setsid ./sid

Ich war ein bisschen überrascht von dem, was Linux (2.6.39) zurückgegeben hat. Ich habe auch die Manpage "credentials" in Abschnitt 7 gefunden.

Mein Rat ist, dies zu tun man 7 credentials(oder das Äquivalent, wenn nicht unter Linux) und den Abschnitt über Prozessgruppen und Sitzungen zu lesen, um zu sehen, ob Sie es herausfinden können.

Bruce Ediger
quelle
1
Als Linux-Neuling konnte ich nicht verstehen, was du gesagt hast. Sieht aus wie Sie auch verwirrt sind? Aber Sie kennen sich wahrscheinlich aus, um zu verstehen, was Arceges Antwort bedeutete. Wenn ja, können Sie dies bitte genauer erläutern?
its_me
Interessant ... danke ... Die Sitzungs-ID (SID) ist die PID des Terminals für ./sidund nohup ./sid, wenn Sie ausgeführt werden setsid ./sid, ist die Sitzungs-ID (SID) brandneu und entspricht der Prozess-PID ... I ' Ich bin mir nicht sicher, warum Nohup die Gabelung verhindert hat (oder zu verhindern scheint), aber ich glaube, ich habe die allgemeine Idee ...
Peter.O