2

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

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

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

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

2 ответа2

4

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

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

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

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

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

0

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

Для этого (в 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

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

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