先看现象。每处理一百条覆盖写一次 checkpoint.json,进程被强杀后文件末尾是半个 JSON,下次启动 json.load 抛 Expecting comma delimiter。
排查方向其实有限,先把可能性排一排。直接覆盖写 中途被打断就是残文件。另一种情况是没有临时文件加改名。
还有一种情况,只写不校验 损坏发现不了。
另外,未保留上一份可用副本。
先改成写临时文件再原子替换
python -c "import os;open('ck.tmp','w').write('{}');os.replace('ck.tmp','ck.json')"
每份写入校验和并附在下一行
python ck.py --write --with-sha256
保留最近两份备份
python ck.py --keep 2
等前面都确认过,再启动时校验失败自动回退上一份
python ck.py --load --fallback
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
改完先别撤,确认这几项。反复强杀进程二十次,重启后都能从最近的完整断点继续,没有一次解析异常。
补一句。覆盖写是断点文件最常见的坑,加一次 os.replace 就能避免。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
