O que são "líderes de sessão" em `ps`?

78

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

wsou eu
fonte

Respostas:

84

No Linux, todo processo possui vários IDs associados, incluindo:

  • ID do processo (PID)

    Este é um número arbitrário que identifica o processo. Todo processo tem um ID exclusivo, mas depois que o processo sai e o processo pai recupera 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 todo pipeline executado por esse shell será um grupo de processos. Isso facilita a matança dos filhos de uma concha quando ela sai. (Veja a saída (3) para detalhes sangrentos.)

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

cjm
fonte
5
Nota: Use ps xao pid,ppid,pgid,sid,commpara visualizar esses IDs.
Mike R
1
Por que as pessoas não dão mais dessas ilustrativa comparação mundo real respostas baseadas .. +1
RootPhoenix
24

Um líder de sessão é um processo em que a identificação da sessão == identificação do processo. Isso parece 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 a identificação do processo ao enviar para a chamada ou comando kill system. O uso mais comum para isso é ao sair de um shell. O sistema operacional enviará kill -HUP -$$, o que enviará um sinal SIGHUP (hangup) para todos os processos com o mesmo ID de sessão que o shell. Quando você rejeita um processo, a identificação da sessão do processo é alterada do shell, para que não responda ao sinal de interrupção. Esta é uma parte do processo para se tornar um processo daemon.

A maioria dos processos chamados no 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 execute a mesma kill -HUP -$$operação 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.

Arcege
fonte
Por favor, não se importe, mas posso precisar de um pouco mais de esclarecimento - - o líder da sessão é um, como são chamados os outros e como eles são (comportamento, o que eles fazem diferente do líder da sessão)?
its_me
Eles são chamados de membros da sessão, acredito.
Arcege 6/08/11
Gosto da sua explicação, mas ainda estou perdendo um ponto: IIUC, a qualquer momento, todo processo iniciado é na verdade filho do shell com o qual eu entrei (a menos que o deserdasse, é claro). Por que o SO não percorre a árvore do processo e mata todos os irmãos desse processo e seus irmãos? (Na verdade, é o que eu sempre pensei que faz ... até hoje: D) Então, qual é a lógica por trás das sessões?
Alois Mahdal
É necessário determinar quando um processo não faz mais parte da sessão original (shell de login ou daemon, por exemplo). Um pensamento pode ser alterar automaticamente o PPID (pai pid) para 1, mas isso quebra a árvore do processo. Um novo ID de sessão cria um grupo que pode receber um sinal juntos. Um exemplo disso é a GUI, inicie o firefox como uma sessão separada. Então, quando o botão [X] for pressionado, envie um sinal para a sessão do firefox e seus filhos, mas o gerenciador de janelas não é afetado - não era possível fazer isso com relacionamentos diretos PPID-PID.
Arcege 14/05
Quando a GUI morre, toda a árvore do processo, não o grupo de sessões, pode receber o sinal. Dois comportamentos desejados diferentes: matar um 'aplicativo' (matar o Firefox e seus plugins), versus matar todos os processos filhos (saindo de uma GUI). Trabalhos similares com emacs e chrome, eu espero.
Arcege 14/05
13

Eu pensei 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;
}

Compilei-o com cc -g -o sid sid.c algumas maneiras diferentes, para ver o que acontece:

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

Fiquei meio surpreso com o que o Linux (2.6.39) retribuiu. Também encontrei a página de manual da 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ê consegue entender.

Bruce Ediger
fonte
1
Sendo um novato no Linux, não consegui entender o que você disse. Parece que você também está intrigado? Mas você provavelmente tem conhecimento suficiente para entender o que a resposta de Arcege significava. Se sim, pode explicar o mesmo com mais clareza?
its_me
Interessante ... obrigado ... Então, o id de sessão (SID) é o terminal PID para ./side nohup ./sid, e quando você corre setsid ./sid, o id de sessão (SID) é novo e é o mesmo que o processo PID ... Eu m não tenho certeza porque nohup impediu o garfo (ou parece), mas eu acho que eu tenho a idéia geral ...
Peter.O