PuTTY comando remoto contendo loop while

0

Eu estou tentando automatizar várias tarefas comuns que eu SSH em um servidor remoto para fazer. Para isso, estou usando o PuTTY e sua opção "remote command" (Connection > SSH) em várias sessões salvas. Meu comando remoto parece algo assim:

~/scripts/test; $SHELL -l

O script executado difere por sessão salva e executa tarefas diferentes. $SHELL -l mantém a sessão do PuTTY ativa depois que o script termina de ser executado.

Tudo isso está funcionando perfeitamente para a maioria dos scripts que estou executando. No entanto, eu tenho um que usa um loop while para executar uma série de comandos até que seja terminado com Ctrl + C. O script começa bem, mas o shell do PuTTY não permanece ativo quando é finalizado. $SHELL -l não parece estar sendo executado.

Um exemplo de script com esse comportamento é o seguinte:

while true; do
echo "."
sleep 2
done

Os seguintes trabalhos são executados manualmente, vejo a saída esperada do segundo comando:

~/scripts/test; echo "done"

No entanto, o segundo comando do "comando remoto" PuTTY não é executado. De fato, se eu alterar o comando remoto para incluir um echo , ele não será exibido.

~/scripts/test; echo "done"; $SHELL -l

Então, eu acho que a minha pergunta é: por que o segundo comando na lista não é executado pelo comando remoto, enquanto é executado manualmente? E, mais importante, o que posso fazer sobre isso?

Se for relevante, estou executando o PuTTY no Ubuntu 14.04.

    
por oogles 24.07.2014 / 01:31

2 respostas

2

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"
    
por 24.07.2014 / 03:47
0

ctrl + c para o comando remoto putty está realmente interrompendo a sessão ssh, então é de se esperar que ele não execute os comandos remotos restantes. Se seu objetivo é apenas manter a sessão ativa, seu loop infinito deve ser suficiente.

    
por 24.07.2014 / 02:27