结论先行:如果扫描中断时留下了可读的任务日志或进度记录,优先用“边界记录法”判断覆盖范围;如果没有任何过程记录,只能退回“抽样验证法”。前者能缩小重跑范围,代价是要求扫描前就开启了日志;后者不依赖事前设置,但通常需要重跑全站才能得到可信结论。判断的关键不是中断发生在第几分钟,而是中断前最后一条记录能否对应到一个可复现的URL边界。
判断覆盖范围之前,先区分三种常见的中断痕迹,它们对应完全不同的处理路径。
需要提醒的是,已处理数量归零或明显偏低,并不必然说明扫描没有生效。进程在写入日志前崩溃、日志被轮转覆盖、输出目录权限不足,都会造成同样的表象。因此看到计数异常时,先排查记录链路本身,再下覆盖范围的结论。
面对中断,常见的两种做法是“从断点续扫”和“全量重扫”,它们各自成立的条件不同。
从断点续扫成立的条件:中断前有稳定的URL排序规则(例如按字母序或按站点地图顺序),且日志记录了最后处理的URL。满足这两点时,续扫的代价最小,只需处理边界之后的部分。风险在于排序规则若在两次运行间发生变化,续扫会产生重复或遗漏,因此续扫前应先用少量URL核对排序是否一致。
全量重扫成立的条件:没有可信边界记录,或者数据时效性要求高、不允许新旧结果混用。全量重扫的代价是时间与请求量成倍增加,好处是结果内部一致,不会出现前半段和后半段来自不同时间点的问题。
一个假设的例子:某次扫描计划处理2000个URL,中断时日志显示已处理到第740条,且排序稳定。此时续扫740条之后的区间是合理的,总工作量约为原来的六成。但如果日志只有“已处理740条”而没有对应URL,就无法确认这740条是否连续、是否去重,续扫可能重复处理大量页面,此时全量重扫反而更省心。
当缺少边界记录时,可以退而用抽样验证:从目标URL集合中随机抽取一批,逐一检查是否在已有结果中出现,用命中比例粗略估计覆盖率。这个方法的适用条件是被抽样的URL集合本身是完整且可枚举的,否则抽样结果没有意义。
抽样只能给出估计,不能给出精确边界,因此它适合用来决定“要不要重扫”,而不适合用来决定“从哪一条续扫”。如果抽样命中率很低,说明覆盖不完整,重扫更稳妥;如果命中率很高但无法定位缺口位置,仍建议重扫,因为残余缺口可能集中在某个目录下,抽样未必能发现。
边界记录法的前提是“日志顺序等于处理顺序”。如果扫描工具采用并发处理,多个线程同时消费队列,日志写入顺序与完成顺序不一致,那么“最后一条日志”并不代表“最后完成的URL”。此时按日志边界续扫,可能跳过仍在处理中的URL,造成遗漏。判断方法很简单:查看日志中相邻记录的时间戳是否单调递增,如果存在明显回跳,说明并发写入,边界记录法失效,应改用全量重扫或按已完成集合做差集。
先打开中断任务的日志目录,确认是否存在逐条URL记录以及时间戳是否单调。若两者都满足,提取最后一条URL作为边界,用它和排序规则生成待处理列表,再抽查边界前后各若干条确认无重复;若任一条件不满足,直接安排全量重扫,并在下次扫描前开启逐条日志与稳定排序,避免同样的问题再次出现。