EDIT: Eu acredito que o problema é que a conexão ssh está criando conexões em segundo plano que ainda estão abertas (cf. link ). Eu rodaria ssh com o -f
flag, mas preciso ter certeza de que o java está instalado. Existe uma maneira fácil de forçar a conexão a fechar a partir do próprio script?
N.B., a máquina remota está no Ubuntu 14.04.
Estou usando uma ferramenta escrita em Clojure que chama o Runtime.getRuntime().exec()
do Java da seguinte forma:
Runtime.getRuntime().exec("ssh", "-o", "StrictHostKeyChecking=no",
"user@host", "sudo su -");'
E então, com o java.lang.Process criado a partir disso, recebo o stdin e escrevo o conteúdo de um arquivo para ele, basicamente, .flush
e .close
do gravador. Tudo funciona bem; há muitos deles, todos acontecendo sem problemas, mas eu tenho um perto do começo que executa um script que se parece com isso:
if [ ! $(which java) ]; then
apt-get update -q
apt-get install -y openjdk-7-jre
fi
E quando eu ssh manualmente no nó, vejo que o Java é instalado com sucesso e o processo é encerrado. Mas, por algum motivo, isso não está sendo comunicado ao código de chamada (ou seja, o processo java acima).
Eu mencionei antes que há muitos deles, e nenhum deles está suspenso. Eu tenho scripts que fazem todos os tipos de coisas, mas também outros que fazem quase a mesma coisa que a anterior, a única diferença é que eles instalam softwares diferentes (como o git), e eles não param.
Então eu tentei fazer isso manualmente; ou seja, indo para um shell e digitando:
ssh -o StrictHostKeyChecking=no -o ubuntu@somehost sudo su -
e depois colando o script lá, e tudo funciona muito bem.
Não tenho certeza do que poderia estar causando isso.