Como evitar que exec mantenha o script em execução?

3

Estou usando exec da seguinte forma:

#!/bin/bash
exec > >(tee /tmp/mylog.log) 2>&1
bash -c 'sleep 12312' &

Eu quero que a saída dos comandos esteja em um arquivo de log e, em seguida, quero iniciar um script de execução longa e desconectá-lo completamente, sem fazer nada para sua saída.

Mas notei que a execução de um script com exec para redirecionar a saída para um arquivo faz com que ele continue sendo executado com o script de longa execução. Por exemplo, salve o script acima em um arquivo /tmp/start.sh , execute-o, ps aux mostrará que /bin/bash /tmp/start.sh ainda está em execução!

Se eu remover a linha exec, no entanto, está funcionando como esperado.

Então, como eu "desanexar" o redirecionamento stdout do exec e fazer o script morrer quando terminar?

    
por Fluffy 20.04.2015 / 17:53

1 resposta

3

O processo bash que continua em execução é o pai de tee , não o script original. Você pode ver isso adicionando rastreamentos que exibem os IDs do processo:

#!/bin/bash
echo original=$$
exec > >(echo substitution=$BASHPID; tee /tmp/mylog.log) 2>&1
bash -c 'echo sleeper=$$; sleep 12312' &

Isso faz com que um processo bash adicional apareça, o pai de sleep . Para se livrar desses processos bash, use exec em todo:

#!/bin/bash
echo original=$$
exec > >(echo substitution=$BASHPID; exec tee /tmp/mylog.log) 2>&1
bash -c 'echo sleeper=$$; exec sleep 12312' &

Eu testei essa resposta no bash 4.3. Versões futuras do bash podem se tornar mais inteligentes em relação às chamadas não finais (como o ksh).

    
por 21.04.2015 / 03:17