Вход через ssh в другой сеанс?

254
Jordan Reiter

Я не знаю точно, каков правильный термин, но я замечаю, что если я войду на удаленный сервер SSH, затем закрою окно, открою новый и снова войду на этот сервер, моя история bash и пользовательские процессы отображаются будь другим. Например, если я запустил фоновый процесс, я не могу вернуться к нему, или что-то, что я напечатал, не будет отображаться в моей истории bash.

Проблема в том, что иногда с моим удаленным сеансом иногда что-то происходит, и вместо того, чтобы быть отключенным, сеанс просто зависает; Я должен закрыть окно и открыть новое для повторного подключения. В результате иногда это означает, что длительный процесс в основном «потерян», так как я не могу вернуться к нему.

Есть ли способ настроить его так, чтобы при повторном входе в систему я снова входил в тот же «сеанс»?

Это использует OS X Terminal.

2
Используйте что-то вроде `screen`,` tmux` или `dtach`. jjlin 10 лет назад 7
Иногда все зависит от того, что я должен был узнать от Google: [screen: продолжайте свои процессы, несмотря на разорванное соединение] (http://www.howtoforge.com/linux_screen) Jordan Reiter 10 лет назад 1
В [Возобновить работу терминала после отключения ssh без мультиплексора (screen / tmux)] есть несколько предложений (http://superuser.com/q/645540/150988) и комментарии под ним. Scott 10 лет назад 0

2 ответа на вопрос

4
Gabe

Когда вы входите на удаленный компьютер, sshd выделяет псевдо-терминал и запускает оболочку входа. Любые запускаемые вами процессы, фоновые или передние, являются дочерними процессами этой оболочки. (Прочтите "fork", "parent process" и "child process"; используйте команду "pstree", чтобы посмотреть состояние системы.)

Если вы отключитесь, например, закрыв свой клиент, sshd закроет псевдотерминал. Это (косвенно, чтение «управляющего терминала» и «лидера сеанса») завершит процесс оболочки, что приведет к тому, что его дочерние элементы будут либо завершены, либо, поскольку их родительский элемент теперь отсутствует, будут переопределены init. (Прочтите «Сигнал HUP» - должно быть в зависимости от того, какие материалы клемм вы найдете - и nohupкоманду.)

Когда вы подключаетесь снова, sshd выделяет новый псевдо-терминал и запускает новый экземпляр вашей оболочки входа в систему. Не существует механизма, позволяющего подключить ранее запущенные процессы - при условии, что они все еще работают - к этой оболочке (если бы она существовала, то каждой программе когда-либо приходилось бы знать, как обращаться со спонтанно появляющимися дочерними процессами, которые могут захотеть использовать стандарт вход / выход и т. д .; «оболочка» - это особый процесс только для вас, пользователя, а не для системы).

Единственный способ сделать это - использовать программу наподобие screenили tmux(могут быть и другие). По сути, это серверный процесс, который управляет своими собственными псевдо-терминалами с помощью оболочек и всего остального, а также клиентский процесс, который может отображать вам содержимое этих ptys и отправлять ваши данные им; при отключении этот клиентский процесс умирает, но при повторном подключении вы можете запустить новый - сервер все еще будет работать.

(Выше приведены некоторые упрощения, но это должно помочь вам понять, что на самом деле происходит. Читайте «псевдо-терминал».)

0
Rafareino

Ну, на самом деле, вы не сможете восстановить свою сессию, на самом деле вы можете извлечь свою историю.

Для этого (в bash) вы должны включить (или изменить) строку в свой .bash_profile в своем домашнем каталоге, чтобы сказать bash, чтобы сохранить введенные вами команды:

export HISTSIZE=1000 # to keep a thousand commands in history export HISTCONTROL=ignoreboth # to prevent some strange behaviors 

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

history 

И найдите их, нажав Ctrl + R, а затем часть команды, которую вы хотите получить.

Позвольте мне сказать, что эта история находится на диске серверов, поэтому, если вы находитесь на общем сервере, команды других пользователей должны быть в том же файле истории, и поэтому вы должны видеть их команды вместо ваших иногда, Ctrl + R должен решить эту проблему проблема.

PS: чтобы применить этот ответ, убедитесь, что вы работаете внутри Bash, просто введите

ps 

и искать удар где-то на экране. Как это:

 PID TTY TIME CMD 24165 pts/3 00:00:00 bash 24169 pts/3 00:00:00 ps 

и вы можете узнать намного больше в

man bash 

Но это займет огромное время, чтобы прочитать.