当定时任务未产生任何输出时,不要立即删除它或反复点击重新运行。“无结果”至少可能意味着四种情况:任务从未被触发;触发后遇到错误;成功完成但输出了空内容;或者输出已生成但未送达通知。请先对问题进行分类,再依据日志证据进行排查。这通常比重建任务更快,也能避免丢失故障现场证据。
首先保留证据:收集四项关键信息
记录任务ID、预期运行时间及对应时区、最近一次成功运行的时间,以及本次运行的最终状态。截图可提供辅助背景,但可复制的运行ID和时间戳才是关键。
如果运行列表中完全没有记录,请检查调度层。如果有开始时间但报错,请检查执行层。如果状态显示成功但计数为零,请检查输入数据和验收标准。如果文件已存在但未收到消息,请单独检查通知管道。
- 暂停自动重试,防止重复写入
- 复制错误摘要和最后一次成功的步骤
- 确认您查看的是本次运行而非历史输出
第一层:触发时间与启用状态
确认任务未被暂停,且调度表达式与界面显示的下次运行时间一致。自然语言时间(如“上午8点”)必须绑定具体时区。服务器时间、账户时间和业务时间可能存在差异。
将下次测试时间提前几分钟,并使用只读任务进行验证。不要为了测试而等到第二天,也不要先修改原任务的其他参数,否则无法确定是哪个设置起了作用。
- 核对星期、日期和月份字段
- 检查夏令时或时区变更
- 确认调度器是否生成了运行记录
第二至四层:输入数据、权限与执行环境
使用与定时任务相同的身份读取输入数据。文件可能存在但不可读,状态码为200的API响应仍可能是登录页或空数组。需检查内容类型、记录数和更新时间,避免将空输入误判为成功。
接着,验证凭证是否过期、任务身份是否具备目标路径所需权限,以及网络出口能否访问依赖服务。需区分连接超时与超出任务总运行时长限制,因为两者的修复方案不同。
- 确认输入非空文件或过期缓存
- 验证最低读写权限
- 记录外部API状态码与响应类型
- 设置重试次数上限与整体超时时间
第五至六层:输出结果与通知机制
进程返回0或状态显示“已完成”,仅表示执行器未上报错误。请打开最终文件或页面,核对本次运行的关键字段、项目数量和生成时间戳。输出路径应为绝对路径,文件名最好包含唯一的运行标识。
通知走的是独立管道。首先,使用固定测试消息验证收件人、渠道权限和过滤规则。不要通过重新运行主任务来测试通知,因为这可能导致重复发布相同内容或产生数据库重复写入。
- 确认输出文件存在且可正常打开
- 检查结果数量与运行耗时
- 单独发送测试通知
修复后的验证与预防措施
完成端到端测试:创建运行记录,读取非空输入,生成新输出,并发送包含输出位置的通知。在临时日志关闭前,等待下一个正常周期。
为每次运行保存开始时间、结束时间、输入数量、输出数量和错误摘要。针对“长时间无运行”和“连续结果为空”分别设置告警。前者通常是调度问题,后者更可能涉及数据或权限。
- 以日期加任务名称作为幂等键
- 为空结果设置异常阈值
- 在凭证过期前发送提醒
- 保留最近一次的成功状态
延伸阅读
如需了解相关领域,请阅读工作流监控与错误恢复指南及WordPress内部链接故障排查流程。
下一步操作
若任务需无人值守运行,请先在 SmaugBrain 中创建一个只读测试任务,并将上述六个层级纳入其验收标准。