代码能跑就不要动-spring boot使用sshd-core空闲连接超时自动断开
编程第一法则:代码能跑就不要动
业务
代码中需要使用ssh连接执行机服务器执行py脚本进行一些耗时操作,比如拉取镜像进行更新等,使用的库是sshd-core
BUG
开发同事在更新完代码后,线上偶现ssh连接超时断开的错误
排查
排查一 找出问题
- 看日志只有断开的日志,找不到具体原因,在日志中显示超过10分钟就报错了
- 排查ssh连接的代码,发现代码中没有配置超时时间或保持连接的配置,只有一个接收返回值30分钟超时的处理,
- 更新前是没问题的,排查这次更新的代码,竟然没有相关修改
仔细
询问同事发现有更改过py脚本,这个脚本是没有纳管的, 对比发现是去掉了一些无用日志
合理的怀疑: 长时间没有输出导致断开
排查二 排查原因
之前没怎么关注过相关知识, AI问答 + google一下
ssh空闲连接的相关参数
客户端(发起请求方): 单位为s,在ssh_config中配置
ServerAliveInterval 600
ServerAliveCountMax 0
服务器端sshd_config(接收请求方):单位为s,在sshd_config中配置
ClientAliveInterval 600
ClientAliveCountMax 0
看一下服务器的配置,和代码中接收消息30分钟超时的逻辑一致
ClientAliveInterval 180
ClientAliveCountMax 10
查找客户端配置时发现:代码中使用的sshd-core和程序所在服务器的ssh配置无关
,由于我们代码中没有配置,使用的是默认参数,参数如下,默认是10分钟, 和报错一致
public static final Property<Duration> IDLE_TIMEOUT
= Property.duration("idle-timeout", Duration.ofMinutes(10));
新问题:服务器设置了ClientAliveInterval参数,怎么还触发了空闲超时? 仔细排查发现执行机有多台,分别有x86和arm两种,查看每一台配置,x86的都是对的,arm中有一台机器配置是错的,找到问题了
遗留问题
sshd-core如何配置ServerAliveInterval和ServerAliveCountMax
sshd-core好像没法直接配置,但另一个库jsch有setServerAliveInterval方法
总结
x86和arm是不同的人配置的,前面的人润了,又没有留下相关文档,导致后面的人不知道,之前没有问题是因为脚本一直有输出,这次更新同事觉得输出的无效日志
有些多,就使用/dev/null 2>&1
语句优化
了一下下,测试的时候选了一个小的镜像进行测试,测试不出问题
教训
代码能跑就不要动
- 各个服务器没有统一配置管理,这个问题比较严重,由于我们之前都是自维护服务器,服务器数量60+, 鬼知道开发人员做了什么操作,后面主要服务上云后才有所改善,但仍有20+服务器需要自己维护,这些服务器运行的哪些进程,是否配置了自动重启,日志管理等都是遗留问题
- 项目管理不规范,项目相关的所有文件都需要纳入代码仓,这种脚本文件之前为了方便,就选择直接放在文件服务器上,没法记录更改
转载自:https://juejin.cn/post/7368107542163996706