服务器关机错过三天维护任务,Persistent会补跑三次还是只触发一次
Persistent让错过日历触发的timer在恢复后补一次唤起,不承诺为停机的每一天逐次重放。若维护业务要求处理漏掉三天,应让一次处理器计算缺失日期并逐日执行,而不是依赖timer替你保存业务进度。
区分触发时间和完成水位
先分开触发进度与业务完成进度。系统记得timer是否错过触发,不等于知道哪些数据日已经处理成功。维护任务应保存自己的最后完成日期,按明确时区和半开区间生成待办;一次启动可以处理多个缺日,成功后再推进业务标记。
核对OnCalendar与Persistent适用范围
附件把最后完成日设为十月二十日、当前日为二十四日,输出二十一、二十二、二十三三个待处理日期。已追平的边界返回空计划。它只做计划演算,不写真实用量或账务,也没有注册timer,所以结果不能被描述为实测了服务器关机与开机。
一次唤起处理多日时,处理器需要保存逐日完成状态,某天失败后不能跳到最后日期一次性标完成。若任务可以部分继续,也要明确失败日如何重试。timer只管何时启动服务,幂等键、业务时间区间和提交状态应属于处理器本身,这样停机恢复与人工补跑才能使用同一套逻辑。
示例unit或排查命令:以下路径与服务名须按目标环境替换,本文没有注册或执行这些服务操作。
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
Unit=demo-maintenance.service
说明时区和时钟同步边界
官方timer语义还包括服务已活跃时不会额外并行启动同一服务。处理器本身仍应设计幂等、失败重试与明确退出码,避免一次漏日出错却把后续全部标完成。需要补历史数据时,进度记录应跟随真正提交,而不是跟随唤起次数或本机日期字符串。
适用范围:不注册真实定时任务;脚本只输出计划不写网关账务,Persistent语义以官方文档与可选用户级实验分别标记。
配套样本与复核入口
- run.py:独立运行程序,包含合成输入、操作和正反例断言。
- case.json:输入说明、预期任务与适用范围,便于保存和交接。
- observed.json:本次实际执行输出;临时路径、进程号和计时可能随运行变化。
运行后one_handler_plan列出三个缺日,already_caught_up为空,日期输入全部在run.py里可见。读者可以先手工列日期再对照程序,确认是否包含当前尚未结束的日期。迁入真实维护处理器时,还需确定时区、最后成功提交日与失败重试;这些业务定义不能由timer的Persistent选项替你决定。
Python3.8以上及标准库即可。本题的维护日期全部是程序内合成输入,运行不会读取网关业务数据,也不会注册服务或定时任务。
python -B run.py
阅读输出时,先按case.json中的任务逐项核对网关systemd定时维护漏跑补偿,再与observed.json比较。非零退出表示依赖或断言需要处理,应保留实际错误。
一手依据1(Persistent仅对OnCalendar补触发;服务已活跃时不会另开一次;不承诺逐次补跑错过的每一天。)。
继续阅读:网关修好配置还是提示start request repeated too quickly,怎样处理启动限额;批量导入渠道到第三行失败,怎样按既定策略保留成功项或整批回滚;按天导出网关用量,怎样避免跨午夜漏单和重复统计。
不想自己搭网关、自己维护渠道?
力达云是托管的 OpenAI / Anthropic 双格式端点,一期提供 DeepSeek,注册送 ¥5 额度。