Como restringir o sinal de interrupção apenas ao processo filho?

2

Eu tenho um monte de arquivos de log e eu quero fazer um tail -f neles em um loop tal que quando eu pressionar Ctrl-C, o atual tail -f é morto e eu prossigo para o próximo arquivo de log:

for log in *.log; do
    printf '%s\n' "Tailing log '$log'; press Ctrl-C to skip to the next"
    tail -f "$log"
done

O problema é que pressionar Ctrl-C mata o próprio loop. Como posso restringir o sinal de interrupção apenas ao processo filho, tail neste caso?

    
por codeforester 13.03.2018 / 23:23

1 resposta

2

Coloque

trap ":" SIGINT

antes do loop. Isso faz com que o shell ignore o sinal. Mas apenas no sentido de que ele executa um comando simulado, não "ignore" no sentido do manipulador de sinal.

Como o processo do shell não bloqueia esse sinal (da perspectiva do kernel), ele passa para seus processos filhos (como tail neste exemplo).

    
por 13.03.2018 / 23:38