Как восстановить оболочку после отключения

37

Я работаю на удаленной машине с CentOS 5.6, и моя сеть продолжает падать. Есть ли способ восстановить мои зависшие сеансы после повторного подключения?

РЕДАКТИРОВАТЬ: я делаю некоторые обновления и установки с yum и беспокоюсь, что это может быть проблемой, если процессы продолжают зависать в середине того, что они делают.

Джефф Шаллер
источник
6
Tmux или экран.
Сехе

Ответы:

63

Там нет никакого способа, но для предотвращения этого я люблю использовать tmux. Я запускаю tmux, начинаю работу и продолжаю свой путь. Если я вернусь и обнаружу, что соединение было разорвано, все, что мне нужно сделать, это восстановить соединение и набрать tmux attach.

Вот пример.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion
Braiam
источник
не имеют tmux, и я не разрешается устанавливать вещи не на моем , чтобы сделать список ...
5
@sergio Мое сердце кровоточит :-)) Используйте screen.
4
@sergio В системе Unix практически любое приложение, для запуска которого не требуются права доступа root, может быть установлено в один домашний каталог.
Кусалананда
35

Рекомендации для tmux и screen являются хорошими предложениями. Они подразумевают ответ на ваш вопрос, но на самом деле не говорят об этом. Ответ на вопрос: нет пути. Если вы входите через ssh, оболочка завершается, когда соединение прерывается. Обходной путь - войти в систему и немедленно запустить виртуальный терминал какого-либо типа (например, tmux). Когда соединение обрывается, оболочка, в которой вы находитесь, заканчивается, но вы можете открыть новую оболочку и повторно подключиться к виртуальному терминалу (то есть работает оболочка, в которой вы фактически выполняете свою работу).

Уильям Перселл
источник
Хорошо. теперь ясно.
Предполагая, что процесс yum все еще выполняется (не завершился сразу, когда оболочка получила SIGHUP), reptyr или аналогичный может быть достаточно для восстановления процесса или - в случае отсутствия - получения любых будущих выходных данных. Оболочка обычно завершается при отключении, хотя.
Эроен
@Eroen Вы имеете в виду, что даже при использовании tmux ОС прекратит процесс tmux, как только обнаружит, что соединение потеряно?
Додзе
@Dojo Когда соединение разорвано, экземпляр tmux будет остановлен, но сеанс tmux (и управляемые им оболочки) останется.
Уильям Перселл
Если пользователь потерял соединение с удаленным ssh-сервером из-за того, что, например, он неожиданно случайно отключил кабель RJ-45, я думаю, что ssh-сервер все еще сохраняет этот сеанс до предопределенного времени ожидания (например, 120 секунд). Таким образом, в этом случае есть ли способ возобновить этот сеанс, который все еще активен на стороне сервера ssh, в течение 120 секунд после отключения кабеля?
Габ 是 好人
8

Как сказал Уильям, короткий ответ - нет, пути нет. Чтобы предотвратить это, вы можете использовать команду экрана, прежде чем потерять соединение

Николас Смит
источник
из того, что я понимаю, я должен был инициировать ням с экрана ... ну, я не сделал. я не могу перезапустить ням, он говорит, что он все еще используется, и я не хочу насильно убивать его. ... Как я могу восстановить контроль над бегущей ням?
и byobu является хорошим дополнением к экрану, чтобы автоматически запускать его в
Насколько я знаю, вы не можете, если только нет какого-то скрытого способа перенаправить вывод команды yum в ваш текущий семестр сеанса, но я не могу вспомнить ни одного из них.
Николас Смит
Существует несколько частичных решений для этого с использованием отладчиков и т. Д. дать процессу новую родительскую оболочку. Reptyr один, и сообщение в блоге описывает проблему, обходной путь и некоторые другие реализации.
Эроен
3

Нет, вы не можете восстановить оболочку после отключения. Вместо этого вы можете убедиться, что команда, которую вы выполняли, продолжает выполняться после отключения.

Для этого используйте команды nohup и disown, которые обычно являются встроенными командами в большинстве оболочек, т.е. вам не нужно ничего устанавливать. Это работает только для неинтерактивных команд.

Итак, шаги будут следующими:

  1. Войти на сервер
  2. Запустите вашу команду: «nohup sudo yum update &» (это также запишет весь вывод в файл nohup.out в вашем текущем каталоге)
  3. Запустите "disown% 1"
  4. Не стесняйтесь отключиться в этот момент или ждите, чтобы отключиться :)

Когда вы вернетесь на сервер, просто "tail nohup.out", чтобы увидеть, как работает команда.

Žygis
источник
Разве это не будет работать довольно плохо в общем случае? Например, с командами, которые хотят вводить то или иное время ... Для полностью неинтерактивных команд это может работать достаточно хорошо и избежать издержек (и, возможно, необходимости установки) терминального мультиплексора.
CVN
Да, это работает, только если ваши команды не хотят никакого пользовательского ввода, я обновил ответ. В общем, терминальный мультиплексор - это верный путь, но было упомянуто, что никакие дополнительные инструменты не разрешено устанавливать.
Зигис
Безусловно, это верный ответ, лишь немного ограниченный в возможных вариантах использования. Проголосовал с правкой.
CVN
3

Кто-то добавил reptyr в комментарии, а не в ответ, так что я не могу его высказать, но это кажется хорошим ответом на отредактированный вопрос и отлично работает на CentOS.

см .: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

Есть ли способ восстановить мои зависшие сеансы после повторного подключения?

РЕДАКТИРОВАТЬ: я делаю некоторые обновления и установки с yum и беспокоюсь, что это может быть проблемой, если процессы продолжают зависать в середине того, что они делают.

То же самое, я потерял удаленное подключение к сеансу обновления yum. Поэтому я искал и нашел этот вопрос ... затем снова подключился и использовал экран:

  1. переподключить SSH
  2. экран
  3. установить reptyr по ссылкам выше
  4. пс-а | grep yum
  5. reptyr psid

и там я нахожусь в восстановленном приглашении, которое давал yum несколькими часами ранее.

Технически все ответы верны, это НЕ восстановление зависшего сеанса, это переопределение потерянного процесса в текущем сеансе. И очень полезно это тоже ...

ingleno
источник
1

Как и многие люди полагают , screenи tmuxони оба поддерживают основные функции, но имеют различные характеристики конкретных, поэтому нельзя сказать , что один превосходит другой во всех случаях. Например, только tmux поддерживает разбиение окна , в то время как только экран GNU может переключать перенос длинных строк с помощью (Ctrl + ar). Смотрите более подробное сравнение здесь .

Существуют также инструменты, специально предназначенные для решения этой проблемы ssh:

Autossh - это программа, которая запускает копию ssh и отслеживает ее, при необходимости перезапуская, если она умирает или прекращает пропуск трафика. Идея из rstunnel.

Mosh - это приложение для удаленного терминала, которое позволяет осуществлять роуминг, поддерживает прерывистое соединение и обеспечивает интеллектуальное локальное эхо и линейное редактирование нажатий клавиш пользователя. Mosh - это замена SSH. Он более надежный и отзывчивый, особенно по Wi-Fi, сотовой связи и междугородной связи.

Ярослав Никитенко
источник
-1

Это можно сделать с помощью tmuxоболочки. Если вы отсоединились, самый быстрый способ восстановить сеанс:

tmux a #0
cmcginty
источник
Это ничего не добавляет, что принятый ответ не говорит. Также предполагается, что у пользователя уже tmuxзапущен сеанс.
Кусалананда
2
Это может быть комментарий к этому ответу, говорящий «Вы можете сокращать attachкак a».
Джефф Шаллер