it-swarm-eu.dev

Co jsou „vedoucí relací“ v `ps`?

Co jsou vedoucí relací, jako v ps -d který vybírá všechny procesy kromě vedoucích relací?

83
its_me

V systému Linux je s každým procesem spojeno několik ID, včetně:

  • ID procesu (PID)

    Toto je libovolné číslo identifikující proces. Každý proces má jedinečné ID, ale poté, co proces skončí a rodičovský proces získá stav ukončení, je ID procesu uvolněno pro opětovné použití novým procesem.

  • ID nadřazeného procesu (PPID)

    Toto je pouze PID procesu, který zahájil daný proces.

  • ID skupiny procesů (PGID)

    Toto je pouze PID vedoucí procesní skupiny. Pokud PID == PGID, pak je tento proces vedoucím skupiny procesů.

  • ID relace (SID)

    Toto je pouze PID vedoucího relace. Pokud PID == SID, pak je tento proces vedoucím relace.

Relace a skupiny procesů jsou jen způsoby, jak zacházet s řadou souvisejících procesů jako s jednotkou. Všichni členové procesní skupiny vždy patří do stejné relace, ale relace může mít více procesních skupin.

Normálně bude Shell vůdcem relace a každý pipeline provedený tímto Shell bude procesní skupina. To má usnadnit zabití dětí Shell, když vyjde. (Viz exit (3) pro podrobné informace.)

Nemyslím si, že pro člena relace nebo procesní skupiny existuje zvláštní termín, který není vůdcem.

87
cjm

Vedoucí relace je proces, ve kterém id relace == id procesu. To zní sice vymyšleně, ale ID relace je zděděno podřízenými procesy. Některé operace v systému UNIX/Linux fungují na procesních relacích, například negují ID procesu při odesílání systémového volání nebo příkazu kill. Nejběžnější použití je při odhlašování z prostředí. OS pošle kill -HUP -$$, který vyšle signál SIGHUP (hangup) do všech procesů se stejným ID relace jako Shell. Když zrušíte proces, ID relace procesu se změní z prostředí, takže nebude reagovat na signál zavěšení. To je jedna část procesu, aby se stal procesem démona.

Většina procesů vyvolaných z správce oken/grafického prostředí má stejné ID relace jako jeden ze spouštěcích programů. To umožňuje operačnímu systému provádět stejný kill -HUP -$$ operace ve všech programech: jako je prohlížeč, hudební přehrávač, libreoffice, IM klient atd. Jedná se o procesy, které nejsou vedoucími relací.

24
Arcege

Myslel jsem, že jsem na to věděl odpověď, ale na to jsem napsal program C.

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

Zkompiloval jsem to s cc -g -o sid sid.c Běžel jsem několika různými způsoby, abych viděl, co se stane:

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

Byl jsem trochu překvapen tím, co Linux (2.6.39) dal zpět. Také jsem našel manuálovou stránku sekce 7, „pověření“.

Moje rada je udělat man 7 credentials (nebo ekvivalent, pokud není v systému Linux), a přečtěte si část o procesní skupině a relaci, abyste zjistili, zda to dokážete zvládnout.

13
Bruce Ediger