Удаленная работа с сервером GNU Linux через нестабильное соединение.

​​Все мы иногда сталкиваемся с тем, что качество нашего интернет соединения порой оставляет желать лучшего. Это может быть вызвано тем, что ваш провайдер неожиданно начал работать так, как будто сам получает интернет через dialup или вам понадобилось срочно подключиться к серверу с дачи, а под рукой у вас только нестабильно работающий edge или 3g. Вы подключаетесь к своему unix-like серверу по ssh, запускаете какой-либо процесс, например, копирование большого файла, копирование начинается, но потом неожиданно связь обрывается и все... надо начинать заново.

Или другой случай. Вы запускаете на удаленном сервере процесс, который будет выполняться часов примерно пять. Не будете же вы все это время держать открытой консоль и держать включенным ваш ноутбук? Конечно, можно запустить процесс в фоне, добавив в конце команды &, но это не всегда бывает удобно. Как же быть в нашем случае? На помощь нам приходит такая полезная утилита, как GNU Screen (далее просто screen). У screen много возможностей и вы можете найти в сети много статей по ее использованию. (Рекомендую после прочтения статьи посмотреть пару видео роликов на youtube посвященных screen). Но мы пойдем путем решения нашей конкретной проблемы при помощи screen, а другие возможности рассмотрим потом. Нам важно, чтобы наша сессия с удаленным сервером сохранялась, даже если соединение оборвется. Подключаемся к серверу ssh и запускаем утилиту просто набрав

screen

Утилита при первом запуске отобразит лицензионное соглашение и информацию об авторах. Просто нажимаем Enter Перед вами отобразится тот же терминал, что и был до запуска утилиты, но теперь мы находимся в сеансе screen

Примечание Если ваш сервер написал что-то вроде -bash: screen: command not found

То это значит, что утилита screen у вас не установлена. Для установки на предках Debian (Ubuntu и т.д) наберите

apt-get install screen

На Red-Hat подобных дисрибутивах наберите:

yum install screen

Хорошо, утилита установилась и вы ее запустили, набрав screen в командной стройке. Запустите какую-нибудь команду, которая будет долго выполняться. Например,

top -S

Теперь просто закройте программу терминала на вашем компьютере, сэмитировав этим аварийное отключение от ssh сессии. Теперь опять подключаемся к серверу и выполняем команду

screen -Dr

Все, подключитесь к нашему сеансу screen, где выполняется команда top -S Теперь вы знаете как вернуться к вашему сеансу, когда вы полняете на сервере команду, которая требует много времени на выполнение. А если получилось так, что вы запустили несколько сеансов screen и не знаете к какому из них подключиться? Для того, чтобы понять что за сеанс вам нужен наберите

screen -list

Система отобразит список запущенных сеансов screen

screen -x There are screens on: 24842.pts-3.fusion-sles12 (Attached) 24232.pts-1.fusion-sles12 (Attached)

наберите screen -x n , где n - номер нужного вам скрина

screen -x 24842

Но вспомнить в каком из скринов у вас запущен нужный вам сеанс бывает сложно, а то и не возможно. Для этого во время запуска screen использутей параметр -S после которого укажите ваше название скрина

screen -S screen_name

Теперь вместо номеров скринов будет отображаться их название. Чтобы подключиться к нужному скрину после параметра -x укажите название скрина.

screen -x screen_name

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

У screen много других возможностей, и ее авторы приследовали явно другие цели нежели восстановление ssh сессии при работе с нестабильным соединением. Утилиту GNU Screen создали Oliver Laumann и Carsten Bormann в 1987 году. Т.е возможно, утилита старше вас.

Давайте посмотрим, чем нам может быть еще полезна screen Представим такую ситуацию. Вы занимаетесь настройкой сервиса, например, apache и вам требуется в режиме реального времени видеть что сервер пишет в лог-файлы. Обычно для просмотра файла в режиме реального времени юниксоиды используют утилиту tail с ключом -f В нашем случае tail -f /var/log/apache/error.log Но мы хотим, чтобы терминал, где мы вполняем команды отображался на этом же экране. Делаем следующее запускаем screen нажимаем ctrl-a + | Да, команды screen выполнять порой не очень просто. Т.е чтобы выполнить перечисленную выше комбинацию надо нажать ctrl-a, это перевет screen в командный режим, потом надо набрать символ | для этого надо зажать shift и нажать кнопку с символом | В итоге ваш экран будет разделен на две части слева останется ваш терминал, а справа отобразится пустой терминал. Чтобы переключиться в правый терминал надо нажать ctrl-a + tab, чтобы запустить в правом пустом экране сессию надо нажать ctrl-a + c Теперь у вас открыто две сессии, которые отображаются одновременно. Чтобы переключаться между ними используйте комбинаю ctrl-a + tab В правом терминале запускаем

tail -f /var/log/apache/error.log

А в левом правим конфиг сервиса и перезапускаем его, при это наблюдаем лог файл в правом терминале. Также экран можно разделить не вертикально, а горизонтально. Для этого вы можете нажать ctrl-a + S (S большая, т.е зажать shift и нажать s) Чтобы убрать разделение нажмите ctrl-a + Q (Q большая)

Вообще логика работы screen немного отличается от той, которую я описал в статье. На screen можно смотреть как на терминал-окно, которое можно при желании свернуть и развернуть. После того, как мы запустили в первый раз screen и выполнили в нем "долгоиграющую" команду, мы могли просто свернуть screen, как окно, нажав ctrl-a + D и потом набрать exit и выйти из терминала разорвав сеанс ssh. При этом screen бы остался запущенным в фоне и к нему можно было бы вернуться при следующем сеансе. Но я не стал говорить про окна в статье про GNU утилиту )

Я сам редко пользуюсь screen, я предпочитаю tmux по ряду причин. Но об этом в другой раз.


Популярные статьи
Недавние статьи
Архив
Поиск по тегам
No tags yet.