¿Qué son los "líderes de sesión" en `ps`?

78

¿Qué son los líderes de sesión, ya ps -dque selecciona todos los procesos excepto los líderes de sesión?

soy yo
fuente

Respuestas:

84

En Linux, cada proceso tiene varias ID asociadas, que incluyen:

  • ID de proceso (PID)

    Este es un número arbitrario que identifica el proceso. Cada proceso tiene una ID única, pero después de que el proceso finaliza y el proceso padre ha recuperado el estado de salida, la ID del proceso se libera para ser reutilizada por un nuevo proceso.

  • ID de proceso principal (PPID)

    Este es solo el PID del proceso que inició el proceso en cuestión.

  • ID de grupo de proceso (PGID)

    Este es solo el PID del líder del grupo de proceso. Si PID == PGID, entonces este proceso es un líder de grupo de procesos.

  • ID de sesión (SID)

    Este es solo el PID del líder de la sesión. Si PID == SID, este proceso es un líder de sesión.

Las sesiones y los grupos de procesos son solo formas de tratar una cantidad de procesos relacionados como una unidad. Todos los miembros de un grupo de procesos siempre pertenecen a la misma sesión, pero una sesión puede tener múltiples grupos de procesos.

Normalmente, un shell será un líder de sesión, y cada canalización ejecutada por ese shell será un grupo de procesos. Esto es para que sea fácil matar a los hijos de un proyectil cuando sale. (Ver la salida (3) para los detalles sangrientos).

No creo que haya un término especial para un miembro de una sesión o grupo de procesos que no sea el líder.

cjm
fuente
55
Nota: Use ps xao pid,ppid,pgid,sid,commpara ver estas ID.
Mike R
1
¿Por qué la gente no da más respuestas ilustrativas basadas en la comparación del mundo real? +1
RootPhoenix
24

Un líder de sesión es un proceso donde la identificación de sesión == identificación de proceso. Esto suena artificial, pero la identificación de la sesión es heredada por los procesos secundarios. Algunas operaciones dentro de UNIX / Linux operan en sesiones de proceso, por ejemplo, negando la identificación del proceso cuando se envía a la llamada o comando kill system. El uso más común para esto es al cerrar sesión en un shell. El sistema operativo enviará kill -HUP -$$, lo que enviará una señal SIGHUP (bloqueo) a todos los procesos con la misma identificación de sesión que el shell. Cuando rechaza un proceso, la identificación de la sesión del proceso se cambia desde el shell, por lo que no responderá a la señal de bloqueo. Esta es una parte del proceso para convertirse en un proceso demonio.

La mayoría de los procesos llamados desde el administrador de ventanas / entorno gráfico tienen la misma identificación de sesión que uno de los programas de inicio. Esto permite que el sistema operativo realice la misma kill -HUP -$$operación en todos los programas: como su navegador, reproductor de música, libreoffice, cliente de mensajería instantánea, etc. Estos son los procesos que no son líderes de sesión.

Arcege
fuente
Por favor, no se preocupe, pero podría necesitar un poco más de aclaración: el líder de la sesión es uno, cómo se llaman los demás y cómo son (comportamiento, ¿qué hacen diferente al líder de la sesión)?
its_me
Se les llama miembros de la sesión, creo.
Arcege
Me gusta su explicación, pero aún me falta un punto: IIUC, en cualquier momento cada proceso que inicié es en realidad hijo del shell con el que inicié sesión (a menos que lo repudie, por supuesto). ¿Por qué el sistema operativo simplemente no recorre el árbol de procesos y mata a todos los hermanos de este proceso y a sus hermanos? (En realidad, eso es lo que siempre pensé que hacía ... hasta hoy: D) Entonces, ¿cuál es la razón detrás del uso de las sesiones?
Alois Mahdal
Es necesario determinar cuándo un proceso ya no forma parte de la sesión original (shell de inicio de sesión o daemon, por ejemplo). Una idea podría ser cambiar automáticamente el PPID (padre pid) a 1, pero eso rompe el árbol de procesos. Una nueva identificación de sesión crea un grupo al que se le puede enviar una señal juntos. Un ejemplo de esto es la GUI, dispara Firefox como una sesión separada. Luego, cuando se presiona el botón [X], envíe una señal a la sesión de Firefox y sus hijos, pero el administrador de ventanas no se ve afectado, no podría hacerlo con relaciones PPID-PID directas.
Arcege
Cuando la GUI muere, entonces todo el árbol de procesos, no el grupo de sesión, podría recibir la señal. Dos comportamientos deseados diferentes: matar una 'aplicación' (matar a firefox y sus complementos), versus matar a todos los procesos secundarios (salir de una interfaz gráfica de usuario). Trabajos similares con emacs y Chrome, espero.
Arcege
13

Pensé que sabía la respuesta a esto, pero escribí un programa en C para resolver esto.

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

Lo compilé, cc -g -o sid sid.c lo ejecuté de diferentes maneras, para ver qué sucede:

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

Me sorprendió un poco lo que Linux (2.6.39) devolvió. También encontré la página de manual de la sección 7, "credenciales".

Mi consejo es hacer man 7 credentials(o el equivalente si no está en Linux), y leer la sección sobre grupo de procesos y sesión para ver si puedes resolverlo.

Bruce Ediger
fuente
1
Siendo un novato en Linux, no pude entender lo que dijiste. ¿Parece que también estás perplejo? Pero probablemente tenga los conocimientos suficientes para comprender lo que significa la respuesta de Arcege. Si lo hace, ¿puede explicar lo mismo con más claridad?
its_me
Interesante ... gracias ... Entonces, el ID de sesión (SID) es el PID del terminal para ./sidy nohup ./sid, cuando se ejecuta setsid ./sid, el ID de sesión (SID) es completamente nuevo y es el mismo que el PID de proceso ... I ' no estoy seguro de por qué nohup impidió que el tenedor (o parece), pero creo que tengo la idea general ...
Peter.O