如何在 DirectAdmin 中设置定时任务

定时任务(cron jobs)是在服务器上按指定时间或间隔自动执行的计划任务。它们对于自动化重复操作至关重要 — 发送计划邮件、生成报告、执行数据库清理、触发备份脚本,或运行 WordPress 维护任务。DirectAdmin 提供了易于使用的定时任务管理器,让您无需命令行操作即可配置这些任务。

什么是定时任务?

"cron"这个名称来自希腊语中表示时间的单词(chronos)。定时任务是一个由服务器的 cron 守护进程按预定计划执行的命令或脚本。每个定时任务由一个 cron 表达式(五个时间字段的组合)加上要运行的命令来定义。保存后,cron 守护进程每分钟检查一次计划,并自动执行匹配的任务。

定时任务语法如何运作

cron 表达式由五个用空格分隔的字段组成:

minute hour day-of-month month day-of-week command

星号(*)表示"每个"— 每分钟、每小时、每天,以此类推。斜杠(/)表示间隔:分钟字段中的 */5 表示"每 5 分钟"。

在 DirectAdmin 中添加定时任务

  1. 登录 DirectAdmin,导航至 Advanced Features(高级功能)。
  2. 点击 Cron Jobs(定时任务)。
  3. 填写五个时间字段:Minute(分钟)、Hour(小时)、Day(日期)、Month(月份)和 Weekday(星期几)。
  4. 在 Command(命令)字段中,输入要执行的命令或脚本路径。
  5. 可选:在 Email Output(邮件输出)字段中输入您的邮箱地址,以便每次运行时接收定时任务的输出内容 — 这对调试非常有用。
  6. 点击 Add(添加)保存。定时任务现已计划好,将自动运行。
定时任务页面,显示所有已配置的定时任务
定时任务页面,显示所有已配置的定时任务
点击 Add Cron Job(圈出)以创建新的计划任务
点击 Add Cron Job(圈出)以创建新的计划任务
输入计划时间和命令,然后点击 Add
输入计划时间和命令,然后点击 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 出错运行,持续向您的邮箱发送错误信息,只需事先做一次简单的手动测试即可轻松避免。

常见使用场景

定时任务是托管账户中最灵活的工具之一。一旦掌握语法,您几乎可以自动化任何重复性的服务器端任务。以下是网站管理员和开发者最常见的应用场景:

服务器端 cron 相比应用层调度(如 WordPress WP-Cron)的核心优势在于:cron 按固定计划运行,不受网站流量影响,无需访客触发,即使在低流量网站上也能稳定运行。

正确读写 cron 表达式

在能够自信地编写 cron 表达式之前,您需要了解五个字段各自的含义以及可用的特殊字符:

五个字段

特殊字符

快速参考示例

调试不运行的定时任务

如果已添加定时任务但似乎没有任何效果,以下是最常见的原因及解决方法:

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 小时 — 可以分散服务器负载,避免多个高负载脚本同时运行相互竞争资源。

VPS 完整定时任务控制

需要具备 root 访问权限、自定义间隔且无任何限制的定时任务?AsiaGB VPS 让您完全掌控服务器的 cron 守护进程。

查看托管套餐