
定时任务(cron jobs)是在服务器上按指定时间或间隔自动执行的计划任务。它们对于自动化重复操作至关重要 — 发送计划邮件、生成报告、执行数据库清理、触发备份脚本,或运行 WordPress 维护任务。DirectAdmin 提供了易于使用的定时任务管理器,让您无需命令行操作即可配置这些任务。
什么是定时任务?
"cron"这个名称来自希腊语中表示时间的单词(chronos)。定时任务是一个由服务器的 cron 守护进程按预定计划执行的命令或脚本。每个定时任务由一个 cron 表达式(五个时间字段的组合)加上要运行的命令来定义。保存后,cron 守护进程每分钟检查一次计划,并自动执行匹配的任务。
定时任务语法如何运作
cron 表达式由五个用空格分隔的字段组成:
minute hour day-of-month month day-of-week command
- 分钟(Minute) — 0 到 59
- 小时(Hour) — 0 到 23(24小时制)
- 月中的天(Day of month) — 1 到 31
- 月份(Month) — 1 到 12
- 星期几(Day of week) — 0 到 7(0 和 7 均代表星期日)
星号(*)表示"每个"— 每分钟、每小时、每天,以此类推。斜杠(/)表示间隔:分钟字段中的 */5 表示"每 5 分钟"。
在 DirectAdmin 中添加定时任务
- 登录 DirectAdmin,导航至 Advanced Features(高级功能)。
- 点击 Cron Jobs(定时任务)。
- 填写五个时间字段:Minute(分钟)、Hour(小时)、Day(日期)、Month(月份)和 Weekday(星期几)。
- 在 Command(命令)字段中,输入要执行的命令或脚本路径。
- 可选:在 Email Output(邮件输出)字段中输入您的邮箱地址,以便每次运行时接收定时任务的输出内容 — 这对调试非常有用。
- 点击 Add(添加)保存。定时任务现已计划好,将自动运行。
cron 表达式示例
每天午夜运行
0 0 * * * — 每天每月 00:00(午夜)运行。
每小时运行
0 * * * * — 在每小时开始时运行(00:00、01:00、02:00 等)。
每周一上午 8:00 运行
0 8 * * 1 — 每周一(星期几字段为 1)上午 8:00 运行。
每 30 分钟运行
*/30 * * * * — 在 00:00、00:30、01:00、01:30 等时间点运行,全天持续执行。
WordPress wp-cron.php 示例
WordPress 有自己的调度系统(WP-Cron),它在有访客访问网站时触发。对于低流量网站,计划中的任务(如发布预定文章或发送新闻通讯)可能无法按时执行。解决方案是禁用 WP-Cron 的内部触发机制,改用真正的服务器定时任务。
首先,在您的 wp-config.php 中添加以下代码:
define('DISABLE_WP_CRON', true);
然后在 DirectAdmin 中,使用以下命令添加一个定时任务(请根据您的 WordPress 安装路径进行调整):
/usr/local/bin/php /home/username/public_html/wp-cron.php
设置为每 5–15 分钟运行一次:*/15 * * * *
PHP 脚本定时任务示例
要通过 cron 运行 PHP 脚本,需要调用 PHP 可执行文件并跟上脚本的完整路径:
/usr/local/bin/php /home/username/public_html/scripts/daily-report.php
如果不确定该使用哪个 PHP 可执行文件路径,请咨询您的主机商,或通过 SSH 运行 which php 命令查询。在 DirectAdmin 服务器上,路径通常为 /usr/local/bin/php,也可能需要指定版本号,例如 /usr/local/bin/php81。
查看输出与错误信息
设置新定时任务时,请务必在 DirectAdmin 的输出字段中填写您的邮箱地址。这样脚本每次运行时打印的所有文字(包括错误信息)都会发送到您的邮箱。如果脚本运行后没有任何输出,您将不会收到任何邮件。若某个任务已确认正常运行,想要屏蔽邮件输出,可在命令末尾添加 >/dev/null 2>&1。
注意 — 添加到 Cron 前先手动测试:在将命令添加为定时任务之前,请务必先通过 SSH 在终端中手动运行该命令,确认脚本能够正确执行、路径为绝对路径,且输出结果符合预期。若一个定时任务每天凌晨 2:00 出错运行,持续向您的邮箱发送错误信息,只需事先做一次简单的手动测试即可轻松避免。
常见使用场景
定时任务是托管账户中最灵活的工具之一。一旦掌握语法,您几乎可以自动化任何重复性的服务器端任务。以下是网站管理员和开发者最常见的应用场景:
- 自动备份 — 设置每天凌晨 2:00 自动运行数据库导出和文件归档,确保始终有最新的恢复点,无需手动操作。
- 文件清理 — 删除随时间积累的临时文件、过期 session 文件和旧日志文件,释放磁盘空间。
- 邮件通知 — 按固定间隔向订阅者发送定期摘要、提醒或新闻通讯。
- 数据更新 — 从外部 API 拉取 RSS 源、汇率、库存数据或价格信息,定期刷新数据库。
- 网站地图更新 — 每晚重新生成 sitemap.xml,确保搜索引擎始终获得最新的页面列表。
- WordPress 维护 — 用真正的服务器定时任务替代 WordPress 不稳定的虚拟 cron,确保预定文章准时发布,插件任务可靠执行。
- 缓存预热 — 清除缓存后提前将页面加载到缓存中,避免第一位真实访客遭遇缓慢的页面加载。
服务器端 cron 相比应用层调度(如 WordPress WP-Cron)的核心优势在于:cron 按固定计划运行,不受网站流量影响,无需访客触发,即使在低流量网站上也能稳定运行。
正确读写 cron 表达式
在能够自信地编写 cron 表达式之前,您需要了解五个字段各自的含义以及可用的特殊字符:
五个字段
- 字段 1 — 分钟 (0–59):在小时内的哪一分钟运行。
30表示第 30 分钟;*/15表示每 15 分钟。 - 字段 2 — 小时 (0–23):24 小时制中的小时数。
2表示凌晨 2:00;*/2表示每 2 小时。 - 字段 3 — 月中的天 (1–31):日历中的日期。
1表示每月 1 日;*表示每天。 - 字段 4 — 月份 (1–12):日历中的月份。
1表示 1 月;*表示每月。 - 字段 5 — 星期几 (0–7):0 和 7 均表示星期日,1 表示星期一,6 表示星期六。
特殊字符
*— 通配符(*),匹配该字段的所有值。/— 步长值。分钟字段中的*/5表示每 5 分钟。-— 范围。星期几字段中的1-5表示周一至周五。,— 列表。小时字段中的0,12表示午夜和正午。
快速参考示例
0 3 * * *— 每天凌晨 3:00(适合夜间备份)*/30 * * * *— 每 30 分钟0 8 * * 1-5— 周一至周五上午 8:000 8 1 * *— 每月 1 日上午 8:00
调试不运行的定时任务
如果已添加定时任务但似乎没有任何效果,以下是最常见的原因及解决方法:
PATH 环境变量未加载
cron 执行命令时不会加载您的 shell 环境。SSH 终端中有效的 PATH 变量在 cron 中不可用。除非使用完整的绝对路径,否则 php、python3、mysql 等命令将无法被找到。请在 SSH 会话中运行 which php 来确认正确的路径。在大多数 DirectAdmin 服务器上,PHP 位于 /usr/local/bin/php 或 /usr/bin/php。
将输出捕获到日志文件
cron 不会在屏幕上显示输出。如果脚本发生错误,除非捕获输出否则您将无从得知。在 cron 命令末尾添加以下内容,即可记录所有输出和错误:
/usr/local/bin/php /home/user/public_html/cron.php >> /tmp/mycron.log 2>&1
定时任务运行后,在文件管理器中打开 /tmp/mycron.log,即可查看输出内容并找出错误原因。
脚本权限与内存限制
请确认您的 PHP 脚本具有正确的文件权限(标准为 644),并且脚本不超过服务器的内存限制。内存不足的脚本会静默终止,不留任何错误信息。
共享主机定时任务最佳实践
共享主机的定时任务与其他账户共享服务器资源,因此与 VPS 或独立服务器相比,需要额外注意以下几点:
使用正确的 PHP 版本路径
DirectAdmin 共享主机通常同时安装了多个 PHP 版本(例如 /usr/bin/php74、/usr/bin/php81、/usr/bin/php83)。请务必在 cron 命令中指定与网站所用相同的 PHP 版本 — 否则脚本可能因 PHP 版本不匹配而出现兼容性错误。
防止任务重叠运行
如果脚本的执行时间超过了计划间隔,多个实例将同时运行,成倍消耗服务器资源。请在脚本中使用锁文件机制来防止重叠 — 在执行开始时写入锁文件,结束时删除,并在发现锁文件已存在时立即退出。
设置内存和时间限制
在 PHP 脚本顶部添加资源限制,防止失控进程过度占用服务器资源:
ini_set('memory_limit', '128M');
set_time_limit(300);
正常运行的任务关闭邮件输出
初始设置阶段,请在 DirectAdmin 中开启邮件输出以便捕获错误。一旦确认定时任务运行正常,请在 cron 命令开头添加 MAILTO="",或将输出重定向到 /dev/null 来关闭邮件通知。否则每次 cron 执行都会产生一封邮件,可能导致收件箱被塞满并耗尽邮件配额。
不要设置过于频繁的执行间隔
在共享主机上,建议避免将定时任务设置为每 5 分钟以上执行一次。如果您的应用确实需要每分钟执行,请考虑升级到 VPS,享有独立资源和完整的 cron 控制权,同时不影响服务器上的其他账户。
常见托管任务的实用定时任务示例
掌握了 cron 语法和最佳实践后,以下即用型示例涵盖了网站管理员和开发者在 DirectAdmin 共享主机上最常运行的自动化任务。请复制后根据您的账户调整用户名和路径:
每周数据库备份
每周日凌晨 2:30 运行,将 MySQL 数据库导出到备份文件:
30 2 * * 0 /usr/bin/mysqldump -u dbuser -p'dbpassword' dbname >> /home/username/backups/db-weekly.sql
请将备份文件保存在 public_html 目录之外,避免通过网络访问。每月定期轮换旧备份文件,以免占满磁盘配额。
每日日志清理
每天凌晨 3:00 运行,删除应用日志目录中 30 天以前的日志文件:
0 3 * * * /usr/bin/find /home/username/public_html/logs/ -name "*.log" -mtime +30 -delete
每 6 小时清除缓存
每 6 小时运行一次 PHP 脚本,清除过期缓存文件,保持网站内容的新鲜度:
0 */6 * * * /usr/local/bin/php /home/username/public_html/scripts/clear-cache.php
每夜重新生成网站地图
每天凌晨 1:00 运行,从数据库重建 sitemap.xml,确保搜索引擎爬虫始终获得最新的页面列表:
0 1 * * * /usr/local/bin/php /home/username/public_html/sitemap-generate.php >> /tmp/sitemap.log 2>&1
将任务分散在不同时间执行 — 凌晨 1:00、2:30、3:00、每 6 小时 — 可以分散服务器负载,避免多个高负载脚本同时运行相互竞争资源。