Quando você executa putty
ou ssh
- não acho que haja alguma diferença neste contexto - com um comando para executar no sistema remoto, o servidor ssh remoto executa o comando como um comando shell:
/bin/bash -c '~/scripts/test; $SHELL -l'
Portanto, você tem uma instância de bash
no sistema remoto que está executando este pipeline. Você também tem outra instância bash
, iniciada pela primeira instância, executando este script "teste".
Quando você digita Control-C, putty
envia o caractere ao sistema remoto, onde ele é interpretado pelo TTY como o caractere de interrupção. Isso resulta no envio de um SIGINT (sinal de interrupção) para processos anexados ao TTY. Isso interrompe ambos os processos do shell, fazendo com que ambos saiam. Você quer que a instância do shell pai ignore o SIGINT.
O comando bash para ignorar o SIGINT é:
trap "" INT
Então, para desativar o SIGINT para o seu pipeline, você alteraria seu comando original para:
trap '' INT; ~/scripts/test; $SHELL -l
Mas isso também desabilita o SIGINT para processos filhos, o que tornaria o script "test" imune ao Ctrl-C. Então você precisa reativar o SIGINT para o script de teste. O comando para isso é:
trap INT
Você pode adicionar essa linha ao próprio script de teste ou adicioná-lo ao pipeline:
trap '' INT; ( trap INT; ~/scripts/test ); $SHELL -l
Agora, quando você pressionar Ctrl-C, deverá interromper o processo de "teste", mas não o processo pai que está executando o pipeline de comando.
Você pode testar isso sem usar putty ou ssh. Apenas execute esses comandos e tente pressionar Ctrl-C enquanto o "sleep" estiver em execução:
bash -c 'sleep 15; echo foo' # Ctrl-C kills sleep; doesn't print "foo"
bash -c 'trap "" INT ; sleep 15; echo foo' # Ctrl-C has no effect
bash -c 'trap "" INT; ( trap INT; sleep 15 ); echo foo' # Kills sleep, prints "foo"