Que sont les "animateurs de session" dans `ps`?

79

Quels sont les leaders de session, comme dans ps -dlequel sélectionne tous les processus sauf les leaders de session?

c'est moi
la source

Réponses:

84

Sous Linux, chaque processus est associé à plusieurs ID, notamment:

  • ID de processus (PID)

    Il s'agit d'un nombre arbitraire identifiant le processus. Chaque processus a un ID unique, mais une fois que le processus s'est arrêté et que le processus parent a récupéré le statut de sortie, l'ID de processus est libéré pour être réutilisé par un nouveau processus.

  • Parent Process ID (PPID)

    Il s’agit simplement du PID du processus qui a démarré le processus en question.

  • ID de groupe de processus (PGID)

    Il s'agit simplement du PID du responsable du groupe de processus. Si PID == PGID, alors ce processus est un chef de groupe de processus.

  • ID de session (SID)

    Il s'agit simplement du PID du responsable de la session. Si PID == SID, ce processus est un leader de session.

Les sessions et les groupes de processus ne sont que des moyens de traiter un certain nombre de processus liés comme une unité. Tous les membres d'un groupe de processus appartiennent toujours à la même session, mais une session peut avoir plusieurs groupes de processus.

Normalement, un shell sera un leader de session et chaque pipeline exécuté par ce shell sera un groupe de processus. Cela permet de tuer facilement les enfants d'un obus lors de sa sortie. (Voir la sortie (3) pour les détails sanglants.)

Je ne pense pas qu'il existe un terme spécial pour un membre d'une session ou d'un groupe de processus qui n'est pas le leader.

cjm
la source
5
Remarque: Utilisez ps xao pid,ppid,pgid,sid,commpour afficher ces identifiants.
Mike R
1
Pourquoi les gens ne donnent-ils pas davantage de réponses de ce type dans le monde réel? +1
RootPhoenix
24

Un responsable de session est un processus où identifiant de session == identifiant de processus. Cela semble artificiel, mais l’identifiant de session est hérité par les processus enfants. Certaines opérations sous UNIX / Linux fonctionnent sur des sessions de processus, par exemple, en annulant l'identifiant du processus lors de l'envoi à l'appel ou à la commande kill system. L'utilisation la plus courante de cela est lors de la déconnexion d'un shell. Le système d'exploitation kill -HUP -$$enverra un message SIGHUP (blocage) à tous les processus avec le même identifiant de session que le shell. Lorsque vous désavouez un processus, l'ID de session du processus est modifié à partir du shell afin qu'il ne réponde pas au signal de raccrochage. Ceci est une partie du processus pour devenir un processus démon.

La plupart des processus appelés à partir du gestionnaire de fenêtres / environnement graphique ont le même identifiant de session que l'un des programmes de démarrage. Cela permet au système d'exploitation d'effectuer la même kill -HUP -$$opération sur tous les programmes: tels que votre navigateur, votre lecteur de musique, libreoffice, votre client de messagerie instantanée, etc. Il s'agit des processus qui ne sont pas des chefs de session.

Arcege
la source
S'il vous plaît ne vous dérange pas, mais j'aurais peut-être besoin d'un peu plus de précision - - l'animateur de session en est un, comment s'appellent les autres et comment sont-ils (comportement, en quoi sont-ils différents de l'animateur de session)?
its_me
Ils sont appelés membres de la session, je crois.
Arcege
Votre explication me plaît, mais il me manque encore un point: IIUC, à tout moment, chaque processus que j’ai commencé est en fait un enfant du shell avec lequel j’ai ouvert une session (à moins que je ne le renie, bien sûr). Pourquoi le système d'exploitation ne se contente-t-il pas de parcourir l'arborescence des processus et de tuer tous les frères et soeurs de ce processus et leurs frères et soeurs? (En fait, c'est ce que j'ai toujours pensé que cela faisait ... jusqu'à aujourd'hui: D) Alors, quelle est la raison derrière l'utilisation de sessions?
Alois Mahdal
Il doit être difficile de déterminer quand un processus ne fait plus partie de la session d'origine (shell de connexion ou démon, par exemple). On pourrait penser changer automatiquement le PPID (pid parent) en 1, mais cela casse l’arbre de processus. Un nouvel identifiant de session crée un groupe auquel un signal pourrait être envoyé. Un exemple de ceci est l'interface graphique, démarrez Firefox en tant que session séparée. Ensuite, lorsque vous appuyez sur le bouton [X], envoyez un signal à la session de firefox et à ses enfants, mais le gestionnaire de fenêtres n'est pas affecté - impossible avec des relations PPID-PID directes.
Arcege
Lorsque l'interface graphique meurt, l'ensemble de l'arborescence de processus, et non le groupe de session, peut recevoir le signal. Deux comportements souhaités: tuer une 'application' (kill firefox et ses plugins), et tuer tous les processus enfants (sortir d'un gui). Des opérations similaires avec Emacs et Chrome, je l’attends.
Arcege
13

Je pensais connaître la réponse à cette question, mais j’ai écrit un programme C pour comprendre cela.

#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;
}

Je l'ai compilé avec cc -g -o sid sid.c je l'ai couru de différentes manières, pour voir ce qui se passe:

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

J'ai été un peu surpris par ce que Linux (2.6.39) a rendu. J'ai également trouvé la page de manuel de la section 7, "Informations d'identification".

Mon conseil est de le faire man 7 credentials(ou l’équivalent si ce n’est pas sous Linux), et lisez la section sur le groupe de processus et la session pour voir si vous pouvez le résoudre.

Bruce Ediger
la source
1
Étant un débutant linux, je ne pouvais pas comprendre ce que vous avez dit. On dirait que vous êtes aussi perplexe? Mais vous êtes probablement suffisamment au courant pour comprendre la réponse d'Arcege. Si vous le faites, pouvez-vous expliquer la même chose plus clairement?
its_me
Intéressant ... merci ... Ainsi, l'identifiant de session (SID) est du terminal de PID pour ./sidet nohup ./sid, et lorsque vous exécutez setsid ./sid, l'identifiant de session (SID) est tout neuf et est le même que le processus PID ... Je Je ne sais pas pourquoi nohup a empêché la fourche (ou semble le faire), mais je pense que j'ai une idée générale ...
Peter.O