it-swarm.it

Cosa sono i "leader della sessione" in `ps`?

Cosa sono i leader della sessione, come in ps -d che seleziona tutti i processi tranne i leader della sessione?

83
its_me

In Linux, a ogni processo sono associati diversi ID, tra cui:

  • ID processo (PID)

    Questo è un numero arbitrario che identifica il processo. Ogni processo ha un ID univoco, ma dopo che il processo termina e il processo padre ha recuperato lo stato di uscita, l'ID processo viene liberato per essere riutilizzato da un nuovo processo.

  • ID processo principale (PPID)

    Questo è solo il PID del processo che ha avviato il processo in questione.

  • ID gruppo di processi (PGID)

    Questo è solo il PID del leader del gruppo di processo. Se PID == PGID, questo processo è un leader del gruppo di processi.

  • ID sessione (SID)

    Questo è solo il PID del leader della sessione. Se PID == SID, questo processo è un leader della sessione.

Le sessioni e i gruppi di processi sono solo modi per trattare una serie di processi correlati come un'unità. Tutti i membri di un gruppo di processi appartengono sempre alla stessa sessione, ma una sessione può avere più gruppi di processi.

Normalmente, una Shell sarà il leader della sessione e ogni pipeline eseguita da quella Shell sarà un gruppo di processi. Questo per rendere più facile uccidere i figli di una Shell quando esce. (Vedi exit (3) per i dettagli cruenti.)

Non credo che esista un termine speciale per un membro di una sessione o di un gruppo di processi che non sia il leader.

87
cjm

Un leader di sessione è un processo in cui ID sessione == ID processo. Sembra forzato, ma l'id di sessione è ereditato da processi figlio. Alcune operazioni all'interno di UNIX/Linux operano su sessioni di processo, ad esempio negando l'id di processo durante l'invio alla chiamata o al comando del sistema kill. L'uso più comune per questo è quando ci si disconnette da una Shell. Il sistema operativo invierà kill -HUP -$$, che invierà un segnale SIGHUP (hangup) a tutti i processi con lo stesso ID di sessione della Shell. Quando si annulla un processo, l'ID sessione del processo viene modificato dalla Shell, quindi non risponderà al segnale di riaggancio. Questa è una parte del processo per diventare un processo daemon.

La maggior parte dei processi richiamati dal gestore di finestre/dall'ambiente grafico hanno lo stesso ID di sessione di uno dei programmi di avvio. Ciò consente al sistema operativo di eseguire lo stesso kill -HUP -$$ operazione su tutti i programmi: come browser, lettore musicale, libreoffice, client di messaggistica istantanea, ecc. Questi sono i processi che non sono leader della sessione.

24
Arcege

Pensavo di conoscere la risposta a questo, ma ho scritto un programma C per capirlo.

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

L'ho compilato con cc -g -o sid sid.c L'ho eseguito in diversi modi, per vedere cosa succede:

./sid
Nohup ./sid > sid.out
setsid ./sid

Sono stato un po 'sorpreso da ciò che Linux (2.6.39) ha restituito. Ho anche trovato la pagina man della sezione 7, "credenziali".

Il mio consiglio è di fare man 7 credentials (o l'equivalente se non su Linux) e leggi la sezione relativa al gruppo di processo e alla sessione per vedere se riesci a risolverlo.

13
Bruce Ediger