如何使用 screen 命令避免 ssh 会话意外终止

screen命令 SSH 示例

让我们首先列出我们当前打开的屏幕会话:

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

从上面的 screen命令输出我们可以看到,目前我们没有打开任何会话。
让我们创建一个新的“screen”会话,同时通过“ssh”连接到远程主机。
打开新终端并输入:

local> $ screen ssh root@10.1.1.15

再次列出我们的screen会话:

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-jack.

上面的 screen输出显示我们有一个添加的 PID id 为 5646的会话。
此时我们可以在远程主机上启动一个进程,例如我们可以执行一个简单的 ping:

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 会话的终端窗口并列出我们的screen:

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-jack.

正如我们所看到的,我们的screen会话现在已分离。
接下来,我们重新创建到远程主机的网络连接:

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”命令也能保持远程进程不中断运行。

运行不间断的 SSH 会话解决方案

使用 screen命令保存会话。
当 SSH 会话断开连接时, screen 命令将使远程进程继续运行。
考虑以下 SSH 示例,其中我们尝试从本地主机“10.1.1.2”到远程“10.1.1.15”主机的 SSH。

SSH 断开连接问题

终端会话可能会因各种网络问题而关闭
在远程机器上运行一个进程,例如:

# Write failed: Broken pipe

由于此网络断开连接, ssh shell 会话也将无意中杀死远程计算机上在 ssh 会话下运行的任何子进程。

日期:2020-07-07 20:54:45 来源:oir作者:oir