Por que o SSH trava no final desses comandos e como posso fazê-lo sair?

10

Eu corro isso:

ssh -t -vvv -i ~/.ssh/druid-keypair -o StrictHostKeyChecking=no ubuntu@${INSTANCE_ADDRESS} <<EOI

# Setup Oracle Java
...

# Install dependencies - mysql must be built from source, as the 12.04 apt-get hangs
export DEBIAN_FRONTEND=noninteractive
sudo debconf-set-selections <<< 'mysql-server-5.5 mysql-server/root_password password diurd'
sudo debconf-set-selections <<< 'mysql-server-5.5 mysql-server/root_password_again password diurd'
sudo apt-get -q -y -V --force-yes --reinstall install mysql-server-5.5

echo "ALL DONE with druid environment setup!"
exit
EOI

Nota: Eu tentei com e sem -t no ssh.

A saída de depuração de -vvv é esta:

...
ldconfig deferred processing now taking place
ALL DONE with druid environment setup!
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0

E então o processo fica lá para sempre. Por que o comando ssh não termina? Eu tentei com -t e sem e tentei com a saída e sem. Não faz diferença :(

Atualização: Quando eu digito 'jobs' no final do script, vejo:

JOBS:
[1]-  Running                 nohup bin/zookeeper-server-start.sh config/zookeeper.properties 2>&1 > /dev/null &
[2]+  Running                 nohup bin/kafka-server-start.sh config/server.properties 2>&1 > /dev/null &

Como posso executar esses serviços e ainda ter uma sessão ssh que termina?

Atualização: agora eu nego manualmente esses processos. A coisa ainda não sai. Companheiro WTF?

Atualização: Ao executar linha por linha, dois comandos não retornam ao shell sem pressionar o CR:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &
rjurney
fonte
Tente usar -q (modo silencioso) em vez de -vvv (modo detalhado).
setembro
sem efeito. -vvv era apenas para depurar.
Rjurney
SSH para o servidor e execute todos esses comandos um por um para descobrir o motivo da interrupção.
setembro
11
É isso aí - nenhum deles trava! Isso funciona bem no console.
rjurney
Funciona se você substituir o conteúdo do bloco << EOI por algo como "eco 1"?
ed.

Respostas:

22

Normalmente, as sessões do terminal SSH são interrompidas se ainda houver conexões em segundo plano ainda abertas. Por conexões em segundo plano, quero dizer coisas como:

  • Encaminhamento de janela X11
  • STDOUT e STDERR

Dê uma olhada nas conexões que ainda estão ativas na sua sessão SSH travada, digitando ~#seu terminal SSH travado.

Pode ser que seu script esteja abrindo sessões que você não percebeu. Ou as configurações do terminal da sua máquina remota, como .profile(ou .bashrcetc.), podem ter algo que estabelece uma sessão. Boa sorte caçando!

A propósito, algumas das outras seqüências de escape oferecidas pelos clientes OpenSSH também podem ser úteis:

Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

Outra coisa, se você deseja que o seu SSH execute seus comandos e saia imediatamente - ou seja, você não deseja uma sessão de terminal remoto - pode usar a -fopção para ssh. Isso forçará a conexão SSH a ser um trabalho em segundo plano.

padub
fonte
3
As seguintes conexões estão abertas: # 0 sessão de cliente (t4 r0 i0 / 0 o0 / 0 fd 5/6 cc -1) É isso que recebo. Isso significa alguma coisa?
moleculezz
-ffunciona para mim.
Jingguo Yao 13/08/17
Ouvi falar de -n para o mesmo propósito, mas isso não funcionou para mim!
Kostas
Um processo em segundo plano conta como background connectione pode disowno processo em segundo plano para que a conexão ssh não seja interrompida?
the_prole