Ubuntu 20.04 上跑数据迁移,SSH 会话在 60 秒没有输出后自动断开,脚本被挂断,sshd_config 里配了 ClientAliveInterval 60 和 ClientAliveCountMax 3,运维一开始以为是网络问题。

真正麻烦的地方在于,几个原因的现象几乎一样。ClientAliveInterval 让服务端每 60 秒探测,三次没响应就断开;客户端侧 ServerAliveInterval 没配,NAT 把空闲连接回收;长时间无输出的任务被判定成空闲会话;中间防火墙的空闲超时比 sshd 更短。

第一件事是确认服务端的心跳配置

sshd -T | grep -i clientalive

然后在客户端也打开心跳

printf 'ServerAliveInterval 30\nServerAliveCountMax 6\n' >> ~/.ssh/config

长任务改用 tmux 承载

tmux new -s migrate 'bash /opt/migrate.sh'

调整服务端空窗时间并重启

sed -i 's/^ClientAliveInterval.*/ClientAliveInterval 300/' /etc/ssh/sshd_config && systemctl restart sshd

命令输出我都留了记录,免得改完记不清原来的值。

改之前先确认了最近有没有人动过配置,避免白查一遍。

别只看报错消失,验证要多做一步。长任务在无输出情况下持续运行超过 10 分钟,SSH 会话不断开,迁移脚本完整跑完。

容易忽略的是,调心跳只能缓解,真正跑批还是应该放 tmux 或 systemd 里,SSH 断了任务也不受影响。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189