使用SFTP的mput命令传输部分文件失败问题排查求助
SFTP批量传输文件部分失败的原因分析
以下是几种可能导致部分文件传输失败的原因:
- 网络波动或连接不稳定:SFTP基于SSH协议,网络丢包、延迟过高或者短暂断连,会导致部分文件传输中途中断,尤其是在批量传输大量文件时更容易出现。
- 目标目录资源不足:目标目录所在磁盘可能存在空间不足、inode耗尽的情况;或是临时出现权限变更,导致部分文件无法写入(即使你能正常进入目录)。
mput命令的并发限制:sftp的mput *.csv会一次性发起多个文件的传输请求,如果文件数量过多,服务器端可能会因为并发连接限制拒绝部分请求,或者客户端无法处理过多并发任务导致传输失败。- 文件状态异常:虽然排除了文件名和内容问题,但脚本执行时,可能有部分CSV文件正被其他进程写入(比如Excel转CSV的进程未完成),文件处于不完整状态,传输时触发EOF错误中断。
- sshpass与sftp交互异常:如果SFTP服务器有额外的交互提示(比如临时的系统通知、主机密钥更新提示),sshpass可能无法正确处理,导致后续的传输命令未被执行。
排查与优化建议
- 添加传输日志:修改脚本记录详细的错误信息,便于定位问题:
查看日志中的错误提示,比如权限报错、磁盘满提示等。sshpass -f password/pass_sftp sftp $SFTP_USER@$SFTP_HOST << EOF > sftp_transfer.log 2>&1 cd /store/availability mput *.csv bye EOF - 改用逐个传输:替换
mput为循环逐个传输,降低并发压力,也便于定位单个失败文件:sshpass -f password/pass_sftp sftp $SFTP_USER@$SFTP_HOST << EOF cd /store/availability $(for file in *.csv; do echo "put $file"; done) bye EOF - 检查目标目录状态:登录SFTP服务器,执行以下命令检查资源情况:
df -h /store/availability # 检查磁盘空间 df -i /store/availability # 检查inode使用 ls -ld /store/availability # 检查目录权限 - 确保文件处于稳定状态:脚本执行前,确认所有待传输的CSV文件已完全生成,比如通过检查文件修改时间是否超过1分钟(避免文件还在被写入):
for file in *.csv; do while [ $(find "$file" -mmin -1) ]; do sleep 10 done done
内容的提问来源于stack exchange,提问作者Diablolik
相关产品推荐
相关产品推荐

