更新时间:2024-10-30 GMT+08:00

VS Code连接后长时间未操作,连接自动断开

问题现象

VS Code SSH连接后,长时间未操作,窗口未关闭,再次使用发现VS Code在重连环境,无弹窗报错。左下角显示如下图:

查看VS Code Remote-SSH日志发现,连接在大约2小时后断开了:

原因分析

用户SSH交互操作停止后一段时间,防火墙对空闲链接进行了断开操作,SSH默认配置中不存在超时主动断连的动作,但是防火墙会关闭超时空闲连接(参考:http://bluebiu.com/blog/linux-ssh-session-alive.html),后台的实例运行是一直稳定的,重连即可再次连上。

解决方法

如果想保持长时间连接不断开,可以通过配置SSH定期发送通信消息,避免防火墙认为链路空闲而关闭。

  • 客户端配置(用户可根据需要自行配置,不配置默认是不给服务端发心跳包),如图1图2所示。
    图1 打开VS Code ssh config配置文件
    图2 增加配置信息

    配置信息示例如下:

    Host ModelArts-xx   
        ……   
        ServerAliveInterval 3600  # 增加这个配置,单位是秒,每1h向服务端主动发个包   
        ServerAliveCountMax 3  # 增加这个配置,3次发包均无响应会断开连接 

    比如防火墙配置是2小时空闲就关闭连接,那我们客户端配置ServerAliveInterval小于2小时(比如1小时),就可以避免防火墙将连接断开。

  • 服务器端配置(Notebook当前已经配置,24h应该是长于防火墙的断连时间配置,该配置无需用户手工修改,写在这里仅是帮助理解ssh配置原理)配置文件路径:/home/ma-user/.ssh/etc/sshd_config

    每24h向client端主动发个包,3次发包均无响应会断开连接

    参考:https://unix.stackexchange.com/questions/3026/what-do-options-serveraliveinterval-and-clientaliveinterval-in-sshd-config-d

  • 对于业务有影响的需要进行长链接保持的场景,尽量将日志写在单独的日志文件中,将脚本后台运行,例如:
    nohup train.sh > output.log 2>&1 & tail -f output.log