Como um script de shell pode evitar o SIGPIPE que seria causado pelo uso de um descritor de arquivo fechado?

4

Um script de shell pode perder seus descritores de arquivo padrão e outros se a outra extremidade desaparecer. Uma maneira de isso acontecer é terminar um cliente ssh usado para iniciar o script:

$ ssh localhost test
^C

Isso inicia um script bash chamado test sobre SSH e uma Ctrl C é usada para finalizar o comando ssh . Isso não termina test , que continua em execução, mas fecha os descritores de arquivos anexados (por exemplo, entrada / saída / erro padrão).

Se test tentar usar esses descritores de arquivos fechados, ele terminará com SIGPIPE . Um simples echo será suficiente.

Uma das coisas que test pode ter é uma função log que usa echo para gravar mensagens no diário do systemd e também para o erro padrão. Algo parecido com isto:

log() {
 echo "$*" | systemd-cat -t test
 echo >&2 "$*"
}

O segundo echo gera um SIGPIPE após a sessão ssh ser eliminada ( Ctrl C ). Isso pode ser protegido contra, para que a execução continue sem o echo ofensivo, colocando o echo em uma subshell:

( echo >&2 "$*" )

Mas existe uma maneira melhor?

    
por starfry 12.11.2016 / 20:09

1 resposta

3

Você poderia, se quisesse ignorar o SIGPIPE no script:

trap "" PIPE
    
por 12.11.2016 / 23:41