Significado de “exec env COMMAND”

4

Eu estou tentando entender o script de serviço clássico /usr/sbin/service , que tem uma linha de código:

exec env -i ...... ${SERVICE} .....

Eu sei que o comando exec não é bifurcado e reterá o processo e substituirá a imagem do processo pelo COMMAND. Então o processo atual é como se fosse executado com o comando.

E quanto ao env ? Será que também faz como o acima?

E por que é melhor substituir o processo atual em vez de bifurcar?

    
por lovespring 24.02.2016 / 05:55

1 resposta

6

O motivo pelo qual ele usa env -i é limpar as variáveis de ambiente antes de executar o restante do comando.

Para realmente responder à sua pergunta, considere o Windows:

No Windows, eles dão a você "CreateProcess", que parece ser uma maneira muito sensata de lançar um novo programa. Mas o problema com o CreateProcess é que existem dezenas de configurações que você pode querer definir para o novo processo, e para cada configuração você precisaria de outro parâmetro para a chamada de função CreateProcess. Isso limita o controle que o pai tem sobre o filho.

No Unix, eles criaram a ideia de que um processo se separa primeiro (herdando todas as configurações do processo) e, em seguida, a segunda cópia pode alterar suas configurações antes de finalmente se substituir pelo novo programa. Isso permite que você use qualquer uma das chamadas do sistema para alterar coisas como diretório atual, ambiente, identificadores de arquivos, sockets abertos, máscaras de sinal e assim por diante, sem precisar adicionar cada um deles como um parâmetro para algo como CreateProcess.

Então, uma habilidade interessante é "encadear" programas que realizam ações de inicialização diferentes. Cada programa muda algo sobre si mesmo, depois "exec" para o próximo programa. env é um desses programas. Ele modifica seu próprio ambiente e, em seguida, executa outro programa. Veja chpst para um ótimo exemplo de todas as coisas que você pode alterar no programa que deseja iniciar.

    
por 24.02.2016 / 06:16