Por que o sudo fork antes de executar o processo?

3

Esta questão pode parecer um pouco tola, mas como em sistemas baseados em Unix, a substituição da imagem de um executável é feita em uma única etapa, substituindo o processo atualmente em execução na chamada de função execve (e derivativos). é:

Por que sudo fork() por padrão antes de execve 'do processo de substituição?

Por forking before, elementos adicionais do kernel precisam ser inicializados, e embora fork seja bastante otimizado em alguns Unices, ainda existem alguns elementos inevitáveis que devem ser inicializados. Se fork() não ocorresse por padrão, o espaço PID aumentaria mais lentamente.

Se você está curioso, esse comportamento padrão pode ser inspecionado emitindo um comando como

sudo sleep 30

o código atual [ 1 ] é bem mais complicado de seguir, já que muitos recursos foram adicionados Desde a; mas na versão hospedada pela Apple [ 2 ] é bem claro o que faz.

#ifndef PROFILING
    if ((sudo_mode & MODE_BACKGROUND) && fork() > 0)
        exit(0);
    else
        EXEC(safe_cmnd, NewArgv);   /* run the command */
#else
/* Complicated code when profiling is enabled, but we don't care */

No momento, estou executando a versão sudo 1.8.11p2, e ela gera o sono de qualquer forma, com ou sem a opção -b , portanto, parece que o código atual ficou mais complicado.

Estou à procura de uma resposta que abranja também por que é este o comportamento padrão e quais os benefícios que isso pode nos trazer.

    
por ssice 02.01.2015 / 19:05

2 respostas

2

O espaço PID no Linux pode ser aumentado para 2 22 com um sysctl simples; isso realmente não é um problema ...

A maioria das distribuições Linux atualmente usa o PAM, e sudo é normalmente compilado com suporte a PAM. Entre outras coisas, ele chama pam_open_session() antes de executar seu programa, portanto, ele também deve chamar pam_close_session() de dentro do mesmo processo, já que seu programa não saberá que precisa fazer isso (e provavelmente não seria permitido para fazer isso).

    
por 06.01.2015 / 17:57
2

O motivo do bifurcação está documentado na seção Process model da página man. O conteúdo relevante é:

This extra process makes it possible to, for example, suspend and resume the command. Without it, the command would be in what POSIX terms an “orphaned process group” and it would not receive any job control signals. As a special case, if the policy plugin does not define a close function and no pty is required, sudo will execute the command directly instead of calling fork(2) first. The sudoers policy plugin will only define a close function when I/O logging is enabled, a pty is required, or the pam_session or pam_setcred options are enabled. Note that pam_session and pam_setcred are enabled by default on systems using PAM.

    
por 03.01.2015 / 00:34