Evita que o SIGINT atinja processos filhos

4

Eu tenho um script bash para executar um servidor, que normalmente será encerrado pelo usuário usando Ctrl-C . Na saída, ele executa uma função de limpeza, que eu não quero que seja interrompida por um segundo Ctrl-C .

#!/bin/bash

...

function cleanup {
    trap '' INT
    echo -n " Cleaning up..."
    scp $SRV:~/$DIR/server.log . && ssh -t $SRV "rm -rf ~/$DIR"
    echo " Finished."

    exit 0
}
trap cleanup EXIT

...

No momento, um segundo Ctrl-C antes da conclusão do scp faz com que o script seja interrompido indefinidamente. Eu entendo que isso tem algo a ver com o SIGINT sendo enviado tanto para o script bash quanto para o processo scp , mas não sei o porquê isso faz com que o script seja interrompido, em vez de apenas causar falha na limpeza.

Então, minha pergunta é:

  1. Por que isso faz com que o script seja interrompido?
  2. Como posso impedir que o SIGINT atinja os processos filhos scp e ssh ?
por Phydeaux 08.03.2017 / 18:57

1 resposta

7

trap '' INT é destinado a ignorar SIGINTs para o shell e todos os seus filhos.

Mas olhando as saídas strace em scp , parece que scp instala seu próprio manipulador SIGINT que cancela o SIG_IGN acima.

A única maneira de impedir que ele obtenha o SIGINT seria executá-lo em um grupo de processos diferente como:

perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...

ou

(set -m; scp ... & wait)

ou diga ao tty driver para parar de enviar SIGINT com o Ctrl-C (como stty -isig , ou stty intr '' para ^C sozinho), embora você queira restaurar as configurações depois:

saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"
    
por 08.03.2017 / 19:28