O que são “líderes de sessão” em 'ps'?

72

O que são líderes de sessão, como em ps -d , que seleciona todos os processos, exceto os líderes de sessão?

    
por its_me 06.08.2011 / 02:22

3 respostas

76

No Linux, todo processo tem vários IDs associados a ele, incluindo:

  • ID do processo (PID)

    Este é um número arbitrário que identifica o processo. Cada processo tem um ID exclusivo, mas depois que o processo é encerrado e o processo pai recuperou o status de saída, o ID do processo é liberado para ser reutilizado por um novo processo.

  • ID do processo pai (PPID)

    Este é apenas o PID do processo que iniciou o processo em questão.

  • ID do grupo de processos (PGID)

    Este é apenas o PID do líder do grupo de processos. Se PID == PGID, esse processo é um líder de grupo de processos.

  • ID da sessão (SID)

    Este é apenas o PID do líder da sessão. Se PID == SID, esse processo é um líder de sessão.

Sessões e grupos de processos são apenas maneiras de tratar vários processos relacionados como uma unidade. Todos os membros de um grupo de processos sempre pertencem à mesma sessão, mas uma sessão pode ter vários grupos de processos.

Normalmente, um shell será um líder de sessão e cada pipeline executado por esse shell será um grupo de processos. Isso é para facilitar a eliminação dos filhos de uma casca quando ela sai. (Veja exit (3) para os detalhes.)

Não creio que exista um termo especial para um membro de uma sessão ou grupo de processos que não seja o líder.

    
por 06.08.2011 / 08:38
23

Um líder de sessão é um processo em que id de sessão == process id. Isso soa artificial, mas o ID da sessão é herdado pelos processos filhos. Algumas operações no UNIX / Linux operam em sessões de processo, por exemplo, negando o id do processo ao enviar para a chamada ou comando do sistema kill. O uso mais comum para isso é quando efetuar logout de um shell. O sistema operacional enviará kill -HUP -$$ , que enviará um sinal SIGHUP (hangup) a todos os processos com o mesmo id de sessão que o shell. Quando você descarta um processo, o ID da sessão do processo é alterado a partir do shell, portanto ele não responde ao sinal de desconexão. Esta é uma parte do processo para se tornar um processo daemon.

A maioria dos processos chamados do gerenciador de janelas / ambiente gráfico tem o mesmo id de sessão que um dos programas de inicialização. Isso permite que o sistema operacional realize a mesma operação kill -HUP -$$ em todos os programas: como o navegador, o music player, o libreoffice, o cliente de mensagens instantâneas etc. Esses são os processos que não são líderes de sessão.

    
por 06.08.2011 / 03:55
12

Eu achava que sabia a resposta para isso, mas escrevi um programa em C para descobrir isso.

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

Eu o compilei com cc -g -o sid sid.c e executei algumas maneiras diferentes para ver o que acontece:

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

Eu fiquei surpreso com o que o Linux (2.6.39) me devolveu. Eu também encontrei a página man seção 7, "credenciais".

Meu conselho é fazer man 7 credentials (ou o equivalente, se não no Linux), e ler a seção sobre grupo de processos e sessão para ver se você pode decifrá-lo.

    
por 06.08.2011 / 04:01