Como fazer ctrl + c / not / interromper o while-loop?

9

Dado este loop:

while sleep 10s ; do
  something-that-runs-forever
done

Quando pressiono Ctrl + C, todo o loop while é interrompido. O que eu quero fazer é interromper o processo "algo", deixar passar 10 segundos e, em seguida, reiniciar "algo".

Como faço para ctrl + c afetar apenas "algo", e não o loop while?

EDIT: "interromper" como em SIGINT. Mate. Abortar. Terminar. Não "interromper" como em "pausa".

    
por bos 23.01.2018 / 09:16

2 respostas

16

Ele deve funcionar se você apenas trap SIGINT para alguma coisa. Como : ( true ).

#!/bin/sh
trap ":" INT    
while sleep 10s ; do
    something-that-runs-forever
done

Interromper o something... não faz o shell sair agora, já que ele ignora o sinal. No entanto, se você ^ C o processo sleep , ele sairá com uma falha e o loop será interrompido devido a isso. Mova o sleep para dentro do loop ou adicione algo como || true para evitar isso.

Observe que, se você usar trap "" INT para ignorar completamente o sinal (em vez de atribuir um comando a ele), ele também será ignorado no processo filho, portanto, você não poderá interromper something... . Isso é explicitamente mencionado pelo menos no manual do Bash :

If arg is the null string, then the signal specified by each sigspec is ignored by the shell and commands it invokes. [...] Signals ignored upon entry to the shell cannot be trapped or reset.

    
por 23.01.2018 / 10:12
0

Outra opção é fazer something-that-runs-forever manipular o sinal (saindo normalmente quando é recebido). É claro que só faz sentido quando este programa é usado em muitos scripts, e o comportamento desejado em CTRL + C é sistematicamente o mesmo - para continuar a execução do script.

    
por 23.01.2018 / 16:31

Tags