usando trap e exec para redirecionar a saída para tee no bash

2

Eu tenho um script que lê linhas de um arquivo e processa cada linha. Eu gostaria de poder fazer algum "pós-processamento" de uma forma que, mesmo quando o script não terminasse de ler todas as linhas, porque eu pressionei Ctrl + C, ele ainda faria o pós-processamento. Para conseguir isso, estou tentando fazer o seguinte:

  1. redireciona o stdout para um arquivo; Mais tarde fazer o pós-processamento desse arquivo, no entanto, eu gostaria de ver o que está acontecendo, então eu gostaria de redirecionar para "tee"
  2. interceptar Ctrl + C e fazer o pós-processamento lá

Consegui fazer 1 ou 2 trabalhos, mas não os dois ao mesmo tempo:

#!/bin/bash

# 2. Either this works 
# trap ctrl-c and call ctrl_c()
trap ctrl_c INT
function ctrl_c() {
    echo "** Trapped CTRL-C"
}

# 1. Or this works    
LOGFILE=/tmp/${FILE}.tee
rm ${LOGFILE}
exec > >(tee ${LOGFILE}) 2>&1

function post_process() {
    # use ${LOGFILE}
}

egrep "(${URL_PATH})" ${FILE} |
    while read LINE ; do
        #...
    done

post_process
    
por Gavriel 17.10.2018 / 12:45

1 resposta

1

Você deve ignorar o ^C / SIGINT na função de pós-processamento:

preprocess(){
   yes baa
}
postprocess(){
   sed 's/a/z/g'
}
preprocess | { trap '' INT; postprocess; sleep 1; echo DONE; }

Quando você executar esse pipeline e pressionar ^C , preprocess será eliminado, mas postprocess continuará em execução até que toda a saída produzida por preprocess tenha sido consumida.

Observe que trap '' INT (com uma string vazia como o manipulador) também ignorará SIGINT nos subprocessos; não substituí-lo por exemplo. trap 'echo INT trapped' INT porque isso fará com que qualquer sed , etc. seja eliminado também por '^ C', apesar do sinal ser tratado no processo pai.

    
por 17.10.2018 / 13:14

Tags