Почему SSH висит в конце этих команд и как я могу заставить его выйти?


10

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

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 &

Попробуйте использовать -q (тихий режим) вместо -vvv (подробный режим).
сентябрь

нет эффекта. -vvv был просто для отладки.
Рюрни

SSH к серверу и выполните все эти команды одну за другой, чтобы выяснить причину зависания.
сентября 13

1
Вот и все - никто из них не зависает! Это отлично работает в консоли.
Рюрни

Работает ли это, если вы замените содержимое блока << EOI чем-то вроде «echo 1»?
ред.

Ответы:


22

Как правило, сеансы терминала 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 быть фоновым заданием.


3
Открыты следующие соединения: # 0 client-session (t4 r0 i0 / 0 o0 / 0 fd 5/6 cc -1) Это то, что я получаю. Это что-нибудь значит?
moleculezz

-fработает для меня.
Цзинго Яо

Я слышал о -n с той же целью, но у меня это не сработало!
Костас

Считается ли фоновый процесс одним background connectionи тем же, может disownли фоновый процесс не зависать?
the_prole
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.