python 之一次低级错误的推导



 写一个小工具,用途是从CDN和samba上下载两批文件,然后对比两批文件的MD5值,以确定上传到CDN的文件是不是确实是samba上的。

 

编程结束,测试发现,24个文件总有固定的3个文件比对MD5值失败。重复多次均是这3个文件比对失败。然后用MD5小工具单独比对出错文件时,两边的MD5又一样。所以怀疑下载好的文件是正确的,MD5加密算法有问题。

 

MD5算法是采用分块计算每个块生成str1,然后再计算str1的MD5的方式。又怀疑是用了stringIO导致读取文件时读取的缓存不对,所以将StingIO去掉换成变量赋值的方式,现象依旧。

 

没办法只好将第一次计算MD5的字符串和第二次计算MD5的字符串分别打印出来比对,发现只有最后一块计算出来的MD5值不正确,前两块计算出的MD5值正确。那么说明算法没有问题,是最后一个块读取出的数据的问题。

 

怎么确定最后的数据哪里不一致呢?一开始以为是读的时候没有正确的发现EOF标志,所以又加日志,在计算最后一块数据的MD5时,输出当前计算的数据到文件。比对情况如下图

 



 

发现最后一块数据的最后几百个字节没有读出来,这三个出错文件均是这种情况。不解,所以又在读取完每一块的时候输出当前的游标值。

 



 

 

发现果然你妹的没有把最后一块数据读完全就去计算MD5了有木有!!又尝试着运行了一遍最初的代码,发现出错的文件变成另外三个了,并且将整个计算MD5的文件拷贝出来单独调用计算,没有问题!!这说明还是跟下载有关。

 

在将计算MD5值的函数单独出来调用时,不小心发现,在从samba server下载文件的时候,脚本已经运行完毕了,但是下载的文件有个别的仍然被脚本shell占用着,并且文件大小是上图中的9478144bytes。当关闭脚本shell后,变成了真正的大小9481600bytes!!这不就清楚了么。

 

真相只有一个!

那就是我在从samba server下载文件后没有手动关闭文件,这样做的结果是,系统会帮你关掉一部分可以关掉的文件,但是有一部分恰巧被shell占用了,没有成功关掉的,那么就会继续被shell占用着,如下图

 



 

 

总结:警惕这种低级错误,警惕一个脚本写一个礼拜,中间断断续续的结果就是你以为你写进去了,但实际你没有写进去,犯了唯物主义错误。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值