先看现象。每处理一百条覆盖写一次 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 就能避免。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189