razão para exec em scripts de wrapper

27

Eu vi exemplos de scripts de wrapper que, em poucas palavras, são os seguintes:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"

Como visto acima, eles usam execpara substituir o shell recém-criado quase imediatamente pelo $myprog. Pode-se conseguir o mesmo sem exec:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"

Neste último exemplo, uma nova instância do bash é iniciada e, em seguida, $myproginiciada como um processo filho da instância do bash.

Quais são os benefícios da primeira abordagem?

Martin
fonte
Veja, por exemplo, stackoverflow.com/questions/18351198/…
Thomas Dickey
Também (em este site!): Use caso / exemplo prático para o shell execbuiltin .
Scott

Respostas:

31

O uso exectorna o wrapper mais transparente, ou seja, torna menos provável que o usuário ou aplicativo que chama o script precise estar ciente de que é um relé que, por sua vez, inicia o programa "real".

Em particular, se o chamador quiser matar o programa, ele simplesmente matará o processo que acabou de lançar. Se o script do wrapper executar um processo filho, o responsável pela chamada precisará saber que eles devem descobrir o filho do wrapper e matá-lo. O script do wrapper pode definir uma armadilha para retransmitir alguns sinais, mas isso não funcionaria com o SIGSTOP ou o SIGKILL, que não pode ser capturado.

A chamada exectambém economiza um pouco de memória (e outros recursos, como PIDs etc.), uma vez que não há necessidade de manter um shell extra por aí sem nada a fazer.

Se houver vários wrappers, os problemas aumentam (dificuldade em encontrar o processo correto para eliminar, sobrecarga de memória etc.).

Alguns shells (por exemplo, o shell Korn) detectam automaticamente quando um comando é o último e não há uma armadilha ativa e colocam um implícito exec, mas nem todos o fazem (por exemplo, não o bash).

Gilles 'SO- parar de ser mau'
fonte
10

Não encontrando duplicatas ... consulte o manual do FreeBSD , que fornece uma boa razão:

A execinstrução substitui o processo do shell pelo programa especificado. Se execomitido, o processo do shell permanece na memória enquanto o programa está sendo executado e consome desnecessariamente recursos do sistema.

que é essencialmente a razão que me foi explicada há algum tempo (por um dos carregadores), e é bastante conhecida.

Thomas Dickey
fonte