Поиск по сайту:

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


Проблема с отключением SSH

Ваш сеанс терминала может быть закрыт из-за различных проблем с сетью, пока вы находитесь в < />Запуск процесса на удаленной машине, например:

Write failed: Broken pipe

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

Запуск решения для непрерывного сеанса SSH

Используйте команду screen для сохранения сеанса. Пока ваша сессия SSH отключается, команда screen будет поддерживать работу удаленного процесса. Рассмотрим следующий пример SSH, в котором мы пытаемся выполнить SSH с локального хоста 10.1.1.2 на удаленный хост 10.1.1.15.

Пример SSH команды экрана

Давайте начнем с перечисления наших текущих открытых сеансов экрана:

local> $ screen -list
No Sockets found in /var/run/screen/S-lubos.

Из приведенного выше вывода команды screen мы видим, что в настоящее время у нас нет открытых сессий. Давайте создадим новую сессию экрана, одновременно подключившись по ssh к удаленному хосту. Откройте новый терминал и введите:

local> $ screen ssh root@10.1.1.15

Перечислите наши сеансы скрининга еще раз:

local> $ screen -list
There is a screen on:
        5646.pts-0.thebeast     (13/05/15 16:49:30)     (Attached)
1 Socket in /var/run/screen/S-lubos.

Приведенный выше вывод на экран показывает, что у нас есть одна сессия, подключенная с идентификатором PID 5646. В это время мы можем запустить процесс на удаленном хосте, так как, например, мы можем выполнить простой пинг:

remote> # ping 8.8.4.4
PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data.
64 bytes from 8.8.4.4: icmp_req=1 ttl=57 time=18.2 ms
64 bytes from 8.8.4.4: icmp_req=2 ttl=57 time=17.2 ms
64 bytes from 8.8.4.4: icmp_req=3 ttl=57 time=18.0 ms

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

local> 
ping 10.1.1.15
PING 10.1.1.15 (10.1.1.15) 56(84) bytes of data.
From 10.1.1.2 icmp_seq=9 Destination Host Unreachable
From 10.1.1.2 icmp_seq=10 Destination Host Unreachable
From 10.1.1.2 icmp_seq=11 Destination Host Unreachable
^C
--- 10.1.1.15 ping statistics ---
13 packets transmitted, 0 received, +3 errors, 100% packet loss, time 12088ms
pipe 3

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

local> $ screen -list
There is a screen on:
        5646.pts-0.thebeast     (13/05/15 16:49:30)     (Detached)
1 Socket in /var/run/screen/S-lubos.

Как мы видим, наша сессия экрана теперь отсоединена. Далее воссоздаем сетевое подключение к удаленному хосту:

local> $ ping 10.1.1.15
PING 10.1.1.15 (10.1.1.15) 56(84) bytes of data.
64 bytes from 10.1.1.15: icmp_seq=1 ttl=64 time=0.951 ms
64 bytes from 10.1.1.15: icmp_seq=2 ttl=64 time=0.563 ms
^C
--- 10.1.1.15 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.563/0.757/0.951/0.194 ms

На этом этапе мы можем снова подключиться к нашему ранее открытому удаленному сеансу ssh:

local> $ screen -d -r
64 bytes from 8.8.4.4: icmp_req=203 ttl=57 time=18.2 ms
64 bytes from 8.8.4.4: icmp_req=204 ttl=57 time=18.1 ms
64 bytes from 8.8.4.4: icmp_req=205 ttl=57 time=18.1 ms
64 bytes from 8.8.4.4: icmp_req=206 ttl=57 time=18.4 ms
64 bytes from 8.8.4.4: icmp_req=207 ttl=57 time=18.1 ms
^C
--- 8.8.4.4 ping statistics ---
207 packets transmitted, 207 received, 0% packet loss, time 206310ms
rtt min/avg/max/mdev = 17.231/18.369/23.795/0.571 ms

Приведенный выше вывод с потерей пакетов 0% является доказательством того, что даже если мы были отключены от удаленной сессии из-за сбоя сети, команда screen не позволила удаленному процессу работать без прерывания.

Статьи по данной тематике: