Finaliza o processo remoto quando a sessão ssh em segundo plano é finalizada

2

Então, agora eu tenho um script bash que executa um comando em uma máquina remota usando o ssh. A máquina que executa o script bash é uma máquina Linux e a máquina remota é uma máquina Windows que executa o cygwin. O script bash contém as seguintes linhas

#!/bin/bash
ssh -i key.pem user@ip "command1" &
# some other commands here, not included because they're not relevant to question
wait

command1 é um processo de longa duração. Atualmente, quando retiro Ctrl-C do meu script antes que a espera seja concluída, o command1 ainda está em execução na máquina remota. Essencialmente se torna desapegada e incontrolável. Eu quero que ele termine quando eu Ctrl-C, caso contrário, a máquina remota será repleta de muitas instâncias de comando1 se eu terminar constantemente meu script prematuramente. Observe o plano de fundo & é necessário porque eu quero executar outros comandos enquanto esse comando está sendo executado.

Já experimentei vários métodos

  1. Adicione a opção "-t -t" para o pseudo-terminal
  2. Adicionada a linha abaixo na esperança de passar o SIGINT para minhas sessões de ssh

    trap 'kill -INT -$$' SIGINT
    

    Eu também fiz uma variação do comando trap onde obtive uma lista de PIDs filhos e iteração através dele matando cada um. Isso não funcionou também. SIGHUP também não funcionou.

Até agora, a única maneira de terminar command1 é se eu apenas executar o comando ssh

ssh -t -i key.pem user@ip "command1"

sem usar o fundo e digite Ctrl-C no mesmo terminal. Não funciona mesmo se eu enviar um SIGINT ou SIGHUP de outro terminal.

Qual é a maneira correta de finalizar comandos remotos via ssh em segundo plano?

NOTA Isso só acontece quando a máquina remota é um ambiente cygwin.

    
por UrbenLegend 19.02.2014 / 19:35

1 resposta

1

Tente algo assim:

#!/bin/bash
function killcommand1() {
    ssh -i key.pem user@ip 'kill 'cat/tmp/command1_pid''
}

trap "killcommand1" SIGINT

ssh -i key.pem user@ip 'command1 & echo $! > /tmp/command1_pid' &
# other commands
wait

Isso funcionou para mim indo de um sistema Linux para outro e, infelizmente, não tenho uma instalação do cygwin disponível, mas essa maneira de enviar o comando kill poderia funcionar de qualquer maneira.

    
por 21.02.2014 / 00:41