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 de "algo", deixar passar 10 segundos e reiniciar "algo".
Como faço para ctrl + c afetar apenas "algo" e não o loop while?
EDIT: "interromper" como em SIGINT. Matar. Abortar. Terminar. Não "interrompa" como em "pausa".
Deve funcionar se você apenas fizer
trap
SIGINT
alguma coisa. Como:
(true
).Interromper o
something...
não faz com que o shell saia agora, pois ignora o sinal. No entanto, se você ^C osleep
processo, ele sairá com uma falha e o loop será interrompido devido a isso. Mova osleep
para dentro do loop ou adicione algo parecido|| true
para evitar isso.Observe que, se você usar
trap "" INT
para ignorar o sinal completamente (em vez de atribuir um comando a ele), ele também será ignorado no processo filho, portanto, você também não poderá interrompersomething...
. Isso é explicitamente mencionado pelo menos no manual do Bash :Outra opção é fazer
something-that-runs-forever
o tratamento do sinal (sair graciosamente quando for recebido). Claro, só faz sentido quando este programa é usado em muitos scripts, e o comportamento desejado em CTRL+ Cé sistematicamente o mesmo - continuar a execução do script.