很多站点的日常运转,靠的不是编辑每天手动点发布,而是一批看不见的定时任务:到点自动发布内容、每天生成一份站点地图、定期清理缓存、凌晨备份数据库、把新地址推送给搜索引擎。这些任务大多数跑在深夜,成功了没人夸,失败了也没人知道,直到某天你发现站点地图里还是上个月的内容,或者备份文件停在了三个月前。
一、先把站点上的定时任务列成清单
不少团队的任务是历史遗留,加的时候记得,过两个月就忘了。做自查的第一步不是检查运行状态,而是先搞清楚到底有哪些任务。
- 服务器层面的 crontab、系统计划任务
- 主机面板里的计划任务(宝塔、cPanel 等)
- 应用内部的调度器,比如框架自带的任务队列、内容系统的定时发布
- 外部服务里的定时任务,比如监控探针、CDN 的刷新脚本
把这三四处的任务合并成一张表,标注执行频率、负责脚本、输出位置和负责人。有了清单,后面每一步才有对照物。
二、确认任务是不是真的在跑
写进 crontab 不等于在运行。命令行环境和你在终端里手动敲命令的环境差别很大,常见翻车点包括:脚本里用的是相对路径、脚本依赖的环境变量在 cron 里根本不存在、命令行调用的 PHP 或 Node 版本与网站运行版本不一致、脚本文件没有执行权限。
验证方法很简单,看产物:
- 站点地图文件的最后修改时间是不是今天
- 备份目录里最新一个压缩包是哪天的
- 日志文件有没有按天切割
- 定时发布的内容是否按计划上线
判断一个任务有没有执行,最直接的办法不是看配置文件,而是看它产出的文件或数据的最后修改时间。
三、失败的时候要让运维知道
定时任务最大的问题是静默失败。系统默认会把 cron 的输出通过邮件发给本地用户,而很多服务器压根没配邮件服务,等于把错误信息直接丢掉了。
输出不要直接扔进 /dev/null
至少把标准输出和错误输出重定向到一个日志文件,保留最近若干次执行的记录。出问题时,这几行日志往往比什么都管用。
关键任务要配告警
- 任务失败时发一封邮件或一条 IM 消息
- 重要任务可以设置失败重试一次
- 连续多次失败时升级通知,而不是每次都重复刷屏
四、留意任务之间的依赖和冲突
单个任务正常,不代表放在一起正常。多个任务同时段执行,很容易互相踩脚:备份脚本锁表时前台访问变慢、生成站点地图的同时正在批量发布内容、清缓存和生成静态页撞在一起,结果谁都没做干净。
- 把对资源敏感的任务错开时间,不要都堆在整点
- 给任务加锁,防止上一次还没跑完下一次又被触发
- 备份、批量生成这类吃 IO 和 CPU 的任务,尽量安排在访问低谷,并适当限制资源占用
五、改版之后要回头复查一遍
站点改版、目录调整、数据库改名之后,很多任务会悄悄失效。比如内容发布脚本还指向旧路径,站点地图生成脚本还在读已经废弃的表,URL 推送脚本的接口密钥早就换了。这些任务表面上还在执行,实际上产出的全是空结果或旧数据。
- 每次结构或路径调整后,对照任务清单逐条回归
- 删掉已经没用的任务,减少噪音
- 把硬编码的路径、域名、密钥集中到配置文件里
- 在运维文档里记录任务的变更历史
把这项检查和备份演练、日志检查一起放进月度运维清单,花不了多少时间,却能避免很多说不清来源的问题。
定时任务是站点的后台流水线,平时看不见摸不着,一旦停摆,最先受影响的往往是内容更新和 URL 发现这类基础环节。与其等发现异常再回头翻日志,不如定期花半小时核对一遍清单和执行结果,让自动化真正可靠地替你干活。