Por que esse script continua em execução depois de receber o SIGINT?

1

Eu aprendi com link que ping sairá com 0 depois de receber SIGINT, o que permite um script bash contendo um comando ping para continuar executando em vez de sair.

Eu tenho um script com comportamento semelhante:

#!/bin/bash                                                                                                                                                                       

while true; do
    sudo -S sleep 4;
    echo $?
    sudo -k;
done

Quando eu o executo, eu digito Ctrl-C quando ele me pede senha, e o script não sai, mas continua em execução. A única diferença é que sudo ao receber SIGINT sai com 1 não 0. Então, eu me pergunto por que o script bash não sai, mas continua em execução? Obrigado.

$ ./test.sh 
[sudo] password for t: 
1
[sudo] password for t: 
1
[sudo] password for t: 
1
...
    
por Tim 01.11.2018 / 01:37

1 resposta

1

O teste não é um simples teste "o comando foi bem-sucedido". Quando um processo sai com SIGINT, seu status de saída pode ser lido por wait(2) . Usando WIFSIGNALED e WTERMSIG , o bash pode dizer se o processo filho (neste caso, o sudo) foi morto diretamente pelo sinal ou não.

Veja o resultado da chamada do sistema ao pressionar Ctrl + C em cat (de acordo com strace ):

wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGINT}], 0, NULL) = 9357

E aqui está o resultado ao pressionar Ctrl + C em sudo -S sleep 4 :

wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 9479

Apenas para completar, aqui está o resultado de Ctrl + C'ing ping localhost :

wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 9710
    
por 01.11.2018 / 01:49