自动化任务:基础对象与机制
任务参数、批次与执行身份
定时任务的可靠性由触发、执行和提交共同决定。先明确批次时区、输入输出与执行账户,再设计互斥和幂等;调度器报告已启动,不能证明业务产物已经完成。
自动化不是定时器本身
自动化 任务契约先明确输入、输出、身份和副作用,再选择触发器。Shell语言执行逻辑、操作系统提供权限和资源、调度器决定何时调用;三者职责不能混合。准备阶段只读取现有Python3.12脚本与配置,不安装依赖、不注册cron、LaunchAgent或计划任务。
参数与工作目录
自动化 参数应显式给出批次日期与固定根目录,不依赖调度器的当前工作目录。命令使用绝对程序路径和分开的参数;路径带空格不意味着需拼接成可执行字符串。示例根目录由脚本所在目录确定,日期采用 YYYY-MM-DD,不能通过参数指定任意输出路径。
最小身份与秘密边界
自动化 身份决定能读取哪些输入和写入哪些产物,调度账户不应默认等于交互登录用户。示例只在自身专用目录写文件,要求目录由运行者拥有且父目录不可被不可信用户改写;不使用管理员或云凭据。配置和日志都不放口令,日志中的用户名和路径也需按受众处理。
成功契约与证据
自动化 成功不等于触发器显示已运行。需要进程退出码、批次标识与最终产物三者一致;定时器本身可能成功启动了一个随后失败的程序。示例成功输出 created 或 unchanged,最终报告内容与指定日期一致;失败返回非零且不把锁目录当成功标记。
练习与参考解答
题目:机器本地时区刚跨午夜,调度器传入2026-10-17,系统当前日期已是2026-10-18。示例应写哪个文件、报告日期是什么?是否需要按当前日期改写参数?
参考解答:以显式批次参数为准,目标是state/report-2026-10-17.json,batchDate为2026-10-17。不能静默改成当前日,否则补跑旧批次会写错幂等键。调度器负责按约定时区选择批次,脚本只验证ISO日期并处理该键;成功证据应同时核对退出0、created/unchanged日期及目标文件内容。
核对资料
调度、幂等、互斥与提交
先明确批次日期、专用 state 目录与执行身份,再对照配套示例理解锁、created/unchanged、退出码和最终报告。
教学版本族:Python 3.12 标准库;cron 常见五字段模型、launchd 与 Windows Task Scheduler 2.0 仅讲调度语义,不注册或运行任务。核对日期2026-10-17,不称为2026最新版。示例未执行,配置与命令需按目标环境验收。
幂等键与内容一致
自动化 幂等是重复同一批次后最终效果相同,不是简单忽略文件存在。日期是本例幂等键,相同日期产生完全相同JSON内容;已有目标内容一致返回 unchanged,不一致返回冲突而不覆盖。真实副作用如发邮件或付款不能靠本地文件标记实现exactly-once。
重入互斥与过期锁
自动化 重入需要任务自身互斥,因为人工调用和多个调度器可能绕开单个调度器策略。本例用原子 mkdir 获取固定锁,已存在退出3,不按时间自动删除锁。进程被强杀可能留下锁,恢复时必须先确认没有存活实例;仅凭mtime很旧不能证明可抢占。
墙钟、时区与补跑
自动化 时钟要区分墙钟日历与单调耗时。夏令时、时区调整、休眠与关机可能导致重复或漏触发;cron五字段不自带历史批次账本。示例显式传入日期,不从“当前时间减24小时”猜业务日,因而可重放漏掉的具体批次。任务耗时日后可用单调时钟度量,不用本地墙钟相减下结论。
触发器与并发策略
自动化 调度比较:Windows MultipleInstancesPolicy 的 IgnoreNew 忽略已有实例期间的新实例,Queue排队,Parallel并发,StopExisting停止旧实例;这些不等同跨任务全局锁。launchd 的 interval 与日历触发也不同,不应承诺睡眠后补齐每一次遗漏。用户会话、工作目录和环境必须单独记录,本例不交付自动启用的调度配置。
练习与参考解答
题目:同日期任务A已获取.lock,手工启动B;A完成replace后在打印created之前被强杀。B第一次及人工确认A已退出、移除空锁后的重跑分别应得到什么?
参考解答:B第一次获取mkdir锁失败,退出3,不能按时间自动抢锁。A强杀可能留下.lock,但最终报告已发布;确认无活跃实例并保留证据后,人工仅移除该空锁。再次同日期重跑比较确定内容,应输出unchanged并退出0,而不是生成第二份报告。调度器IgnoreNew无法阻止独立手工B,所以任务自身互斥仍必要。
核对资料
本节沿用本页资料与示例入口。
继续阅读
- 完整实践
- 知识专题