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

8

Eu corro isto:

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 em 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 eu tentei com a saída e sem. Não faz diferença: (

Atualização: quando 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 desisto manualmente esses processos. A coisa ainda não sai. Companheiro WTF?

Update: Ao executar linha por linha, dois comandos não retornam ao shell sem bater em CR:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &
    
por rjurney 09.07.2013 / 01:52

1 resposta

19

Normalmente, as sessões de terminal SSH ficam suspensas se ainda houver conexões em segundo plano ainda abertas. Por conexões de fundo, 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 suspensa digitando ~# em seu terminal SSH suspenso.

Pode ser que o 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 .bashrc , etc.), podem conter algo que estabeleça 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.)

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

    
por 09.07.2013 / 23:41