2013-11-22 4 views
4

Я знаю, что эти вопросы задавались годами, и ответ на них часто бывает screen или tmux. Я обязательно буду использовать screen в начале, если я знаю, что я оставлю сессию в течение длительного времени, или сеть слишком плоха, чтобы поддерживать надежное соединение.Как подключиться к случайно отключенному сеансу ssh БЕЗ экрана или tmux

Основная проблема заключается в том, когда я запускаю сеанс и обнаруживаю, что он должен длиться долгое время, или соединение просто потерялось случайно. В более позднем случае, часто, когда я начинаю другую сессию сразу, я могу найти, что предыдущие процессы не были убиты в то время, но у меня просто нет возможности повторно подключиться к их терминалу.

Так что мне интересно, возможно ли предотвратить нормальные процессы после смерти даже после случайного отключения сеанса ssh. И самое главное, я могу подключиться к их терминалам , не запустив их в screen заранее.

Если нет, возможно ли переместить уже запущенную сессию ssh в новую сессию screen для последующего повторного подключения?

+0

Из любопытства, почему вы не хотите вызывать экран? – SpliFF

+1

@SpliFF обычно это не я не хочу, но только потому, что слишком поздно, как я сказал в вопросе (случайно отключен или понял, что мне нужен экран в полупустынной сессии). BTW, экран также разбивает буфер прокрутки шпатлевки и iterm, который позволяет легко прокручивать, перетаскивая полосу прокрутки, возможно, ее можно настроить? Но я просто слишком ленив, чтобы это исправить. – lyu

ответ

1

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

Что касается добавления существующего процесса на новый экран, я думаю, что это возможно. Попробуйте инструкции здесь: http://monkeypatch.me/blog/move-a-running-process-to-a-new-screen-shell.html

The first thing to do is to suspend the process. In my case, Irssi can be suspended by typing ctrl+z. 

Secondly, resume the process in background: 

$ bg 

Now, we will detach the process from its parent (the shell). So, when the parent process will be terminated, the child (Irssi) will be able to continue. For this, we use the disown builtin: 

$ disown irssi 

Launch a screen session: 

$ screen 

As we are in a screen session, we will retrieve the irssi process. To do so, we use the reptyr command which take a pid: 

$ reptyr <pid> 

To avoid the tedious pid research, we can use the pgrep command: 

$ reptyr $(pgrep irssi) 

Now the process is in a screen shell, we can safely detach our session and no longer worry about killing our X server or close our ssh connection. 

you'l нужно reptyr для этого.

ВАРИАНТ 2:

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

На вашем клиенте, в $HOME/.ssh/config оных:

ServerAliveInterval 60 
ServerAliveCountMax 5 

Теперь ваши сессии не будет тайм-аут, даже если сервер не отвечает в течение 5 минут.

+0

Я действительно не понимаю ОПЦИЯ 2, я знаю, что тайм-аут может быть установлен, но как только я потерял связь, все ли ушло? Даже если таймаут inf, я до сих пор не могу подключиться к нему? – lyu

+1

Вариант 2 - это минимизация вероятности потери соединения в первую очередь.Даже если ваш интернет отключится в течение 4 минут, перечисленные выше варианты сохранят вашу сессию. Но да, как только это действительно исчезло (например, перезагрузка клиента, случайно закрытый терминал и т. Д.), Это в значительной степени. – SpliFF

+0

Спасибо, я получил вариант 2 сейчас. Но в Варианте 1 есть некоторые проблемы: – lyu

0

Использование SSH-tmux вместо tmux:

function ssh-tmux(){ 
    if ! command -v autossh &> /dev/null; then echo "Install autossh"; fi 
    autossh -M 0 $* -t 'byobu || {echo "Install byobu-tmux on server..."} && bash' 
} 
0

Я работал на текстовый файл с помощью нано и я отсоединился. После того, как я вошел в систему, я увидел, что процесс nano из предыдущего сеанса все еще работает, но я не мог переключиться на этот экземпляр nano. Итак, я убил нано-процесс, а затем создал файл с именем: filename.save, который имел мои изменения с первого сеанса.