Dado este loop:
while sleep 10s ; do
something-that-runs-forever
done
Quando pressiono Ctrl + C, o loop while é interrompido. O que eu quero fazer é interromper o processo "algo", deixar 10 segundos passar e reiniciar "algo".
Como faço para que ctrl + c afete apenas "algo", e não o loop while?
EDIT: "interromper" como em SIGINT. Mate. Abortar. Terminar. Não "interromper" como em "pausar".
fg
? Por que usar Ctrl + C?What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"
. Se você pressionar Ctrl + Z, aguarde 10s e depois executefg
, é exatamente o que acontecerá. Talvez você possa editar sua pergunta e dar um exemplo específico para que possamos entender melhor?Respostas:
Deveria funcionar se você apenas
trap
SIGINT
para alguma coisa. Como:
(true
).Interromper o
something...
comando 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 o interior do loop ou adicione algo parecido|| true
para evitar isso.Observe que, se você
trap "" INT
ignora completamente o sinal (em vez de atribuir um comando a ele), ele também é ignorado no processo filho; portanto, você também não pode interrompersomething...
. Isso é mencionado explicitamente no manual do Bash, pelo menos :fonte
do (trap - INT; something-that-runs-forever)
permitir a interrupção do comando. Além disso, você não precisa correr:
- você pode apenas usar uma seqüência vazia para ignorar um sinal:trap '' INT
. Tudo isso é POSIX, e deve funcionar em qualquer shell compatível (não apenas no Bash).SIGINT
na íntegra não é estritamente portátil: " implementações podem permitir nomes com oSIG
prefixo ou ignorar caso em nomes de sinal como uma extensão . (Ênfase minha)"trap "" INT
(também POSIX)trap :
em vez detrap ""
foi exatamente isso, para não ter o sinal ignorado (mas torná-lo um não-op vez), de modo que não precisamos fazer mais nada para ser capaz de interromper o principalsomething
programa.Outra opção é
something-that-runs-forever
manipular o sinal (saindo normalmente quando é recebido). Obviamente, só faz sentido quando esse programa é usado em muitos scripts, e o comportamento desejado no CTRL+ Cé sistematicamente o mesmo - para continuar a execução do script.fonte