计算机睡眠时是否可以保持 SSH 会话处于活动状态?当我让我的 Mac (Lion) 短时间休眠然后唤醒它时,会话仍然存在,但如果我离开它过夜,会话连接就会关闭。
我试过设置:
ClientAliveInterval 3600 ClientAliveCountMax 10
相同的结果
为什么会话在短时间内“存活”?如何控制此超时?
我发现答案取决于 tcp keepalive 设置:
有关可用 TCP 设置的列表(FreeBSD 4.8 和 5.4):
sysctl -A | grep net.inet.tcp
net.inet.tcp.keepidle
- 在发送 keepalive 探测(如果启用)之前(TCP)连接必须处于空闲状态的时间量(以毫秒为单位)。
net.inet.tcp.keepintvl
- 发送到远程机器的 keepalive 探测之间的间隔,以毫秒为单位。在发送 TCPTV_KEEPCNT(默认 8)探测后,没有响应,(TCP)连接被丢弃。
net.inet.tcp.always_keepalive
- 假设在所有 TCP 连接上都设置了 SO_KEEPALIVE,内核会定期向远程主机发送一个数据包以验证连接是否仍然正常。
因此计算最大 TCP 非活动连接时间的公式如下:
net.inet.tcp.keepidle + (net.inet.tcp.keepintvl x 8)
结果以毫秒为单位。因此,通过设置
net.inet.tcp.keepidle = 10000
net.inet.tcp.keepintvl = 5000
net.inet.tcp.always_keepalive = 1 (must be 1 always)
当 TCP 连接中断时,系统将断开呼叫:10000 + (5000 x 8) = 50000
毫秒(50 秒)。为了让系统在启动时记住这些设置,您应该将它们添加到/etc/sysctl.conf
文件中
如果您想要一个优雅的解决方案来保持远程会话处于活动状态,您应该检查该screen
实用程序。使用此实用程序时,即使在注销或关闭计算机后,您也可以保持远程程序运行。然后您可以screen
稍后重新连接可用的会话。
Screen需要一些时间来学习基础知识,但是当您掌握它时,您会看到它的强大。
您可以查看此链接以获取有关使用屏幕的教程:http ://www.thegeekstuff.com/2010/07/screen-command-examples/
另一种可能的解决方案是mosh,它不完全是 SSH,但在您的计算机进入睡眠状态时,甚至在更改 IP 地址之后,它确实使您的 shell 连接保持活动状态。
另一种解决方案是使用autossh,它基本上监控您的 ssh 会话并在它被中断时立即重新连接(例如,在睡眠周期之后,但如果您失去 WiFi 连接一段时间,例如)。这对于转发的端口/ssh 隧道特别有效。
这是一个教程: http: //linuxaria.com/howto/permanent-ssh-tunnels-with-autossh。
有时,会话在没有数据传输时关闭。保持htop
打开状态通常会阻止我的 ssh 连接关闭,并提供有用的实时信息。
Keepalive 应该做同样的事情。您可以尝试将间隔(两个 keepalive 之间的延迟)减少到 60 左右,看看它是否会改变任何东西。