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?

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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.