shell脚本中如何用单次curl实现响应为0字节时跳过写入文件
解决方案
你可以通过单次请求将内容先写入临时文件、校验大小后再替换原文件的方式彻底消除隐患,全程仅发起一次curl请求,不存在两次请求的时间差问题。
最终实现代码
#!/bin/sh INCOMING="http://www.example.jp/csv/ranking.csv" OUTPUT="/var/www/html/csv/ranking.csv" # 创建临时文件存储下载结果 TEMP_DOWNLOAD=$(mktemp) # 单次curl请求下载内容到临时文件 curl -s -L "$INCOMING" -o "$TEMP_DOWNLOAD" # 判断临时文件大小是否非0 if [ -s "$TEMP_DOWNLOAD" ]; then # 校验通过才覆盖原文件,mv操作为原子操作,不会损坏原有文件 mv -f "$TEMP_DOWNLOAD" "$OUTPUT" else # 下载内容为空则直接清理临时文件,不改动原有文件 rm -f "$TEMP_DOWNLOAD" fi
方案优势
- 仅发起1次远端请求,完全避免两次请求间隔内远端文件变更的风险
- 所有校验操作都针对本次请求返回的实际内容,不会出现校验和实际写入内容不一致的问题
- 使用
mv原子替换原文件,就算替换过程中服务器中断也不会出现原文件损坏、半写入的问题 - 兼容大体积CSV文件场景,不会占用过多内存
内容的提问来源于stack exchange,提问作者qwe001
相关产品推荐
相关产品推荐

