8

Я запускаю это:

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

Примечание: я пробовал с и без -t в ssh.

Вывод отладки из -vvv:

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

И тогда процесс просто сидит там навсегда. Почему команда ssh не заканчивается? Я пробовал с -t и без, и я пытался с выходом и без. Это не имеет значения :(

Обновление: когда я набираю 'jobs' в конце скрипта, я вижу:

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 &

Как я могу запустить эти сервисы и все еще иметь сессию ssh, которая заканчивается?

Обновление: теперь я вручную отрекаюсь от этих процессов. Вещи все еще не выходят. WTF приятель?

Обновление: при выполнении построчно две команды не возвращаются в оболочку без нажатия CR:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &

1 ответ1

19

Как правило, сеансы терминала SSH зависают, если все еще остаются открытые фоновые соединения. Под фоновыми связями я имею в виду такие вещи, как:

  • X11 переадресация окна
  • STDOUT и STDERR

Посмотрите на соединения, которые все еще активны в зависшем сеансе SSH, набрав ~# в зависшем терминале SSH.

Возможно, ваш сценарий открывает сеансы, которые вы не понимали. Либо в конфигурациях терминала удаленной машины, таких как .profile (или .bashrc и т.д.), Может быть что-то, что устанавливает сеанс. Удачи в охоте!

Кстати, некоторые другие escape-последовательности, предлагаемые клиентами OpenSSH, также могут быть полезны:

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.)

Еще одна вещь: если вы хотите, чтобы ваш SSH просто запускал ваши команды и немедленно выходил из системы, то есть вы не хотите сеанс удаленного терминала, вы можете использовать опцию -f для ssh . Это заставит соединение SSH быть фоновым заданием.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .