网站

设置和管理 Cron 任务

A cron job runs a command on a schedule, in the background, whether or not anyone is visiting your site. This guide covers adding one in KPanel, writing the schedule and the command correctly for…

Cron 任务在后台按照计划运行命令,无论是否有人访问您的网站。本指南涵盖在 KPanel 中添加任务、为此平台正确编写计划和命令、替换 WordPress 不可靠的内置调度器,以及在任务未按预期运行时查找输出。

Cron 在 KPanel 中的位置

Cron 属于某个站点,因此您需要从该站点而不是从主菜单访问它:

  1. 登录 KPanel,然后在左侧边栏中点击网站
  2. 点击您要操作的站点。
  3. 在站点的菜单中,打开高级,然后点击 Cron

直接地址是 /websites/<site-id>/cron。您将看到现有任务的表格,或者如果站点没有任务则显示空状态。

KPanel 中站点的 Cron 任务

添加任务

点击右上角的添加 Cron 任务。表单有三个字段。

计划

六个预设按钮会为您填充表达式:

按钮表达式
每分钟* * * * *
每 5 分钟*/5 * * * *
每小时0 * * * *
每天凌晨 2 点0 2 * * *
每周日0 2 * * 0
每月 1 号0 2 1 * *

或在 Cron 表达式中输入您自己的表达式。五个字段按顺序分别是:分钟、小时、月份中的第几天、月份、周几:

minute  hour  day-of-month  month  day-of-week
  • 0 3 * * * 每天凌晨 3:00 运行。
  • */15 * * * * 每十五分钟运行一次。
  • 0 9 * * 1 每周一上午 9:00 运行。
  • 30 1 1 * * 每月 1 号凌晨 1:30 运行。
  • 0 */6 * * * 每六小时整点运行一次。

标签

一个您稍后能识别的名称,例如 WordPress cronNightly stock sync。这是任务表显示给您的内容,所以请使其具有描述性:job 3 在凌晨 2 点对任何人都没有帮助。

命令

要运行的 shell 命令。点击保存以创建任务。

使用完整路径。Cron 运行时环境最小化,不会加载您的 shell 配置文件,因此通过 SSH 登录时可用的简单命令 php 或相对目录在这里会无声地失败。每次都写出完整路径。

编写命令

任务以您站点的系统用户身份运行,因此您的主目录是正确的锚点,~ 可以正确解析。您的站点文件位于:

~/htdocs/yourdomain.co.nz

您可以在站点的文件选项卡中确认确切路径,然后点击 SFTP 标签,其中会在站点文件下打印路径。

典型命令:

cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now
cd ~/htdocs/yourdomain.co.nz && /usr/bin/php bin/send-queued-emails.php
/usr/bin/curl -fsS https://yourdomain.co.nz/api/nightly-report

在安排任务之前先测试命令。如果是 wp 命令,请将其粘贴到站点的 WordPress 中的控制台部分,或通过 SSH 运行。一个注定不会工作的任务在提示符处比在凌晨 3 点的日志文件中要容易发现得多。

替换 WordPress 的内置调度器

WordPress 附带自己的伪调度器 WP-Cron,它仅在有人加载页面时触发。在访问量较少的站点上,计划的文章发布延迟,邮件堆积未发送。在访问繁忙的站点上,每个访问者都要付出检查计划的成本。

真正的 cron 任务可以解决这两个问题。KPanel 为您完成整个交换:

  1. 打开站点,然后打开 WordPress 标签。
  2. 打开 WP-Cron 部分。
  3. 点击启用系统 cron

这会添加一个每五分钟运行 WP-Cron 的计划,并设置 DISABLE_WP_CRON 以停止页面加载触发它。同一屏幕上的移除系统 cron 会撤销两个部分。

如果您宁愿手动操作,只需两个步骤:

禁用访问者触发的版本。 使用文件,然后文件管理器,将以下内容添加到 wp-config.php,在 /* That's all, stop editing! */ 行之上:

define( 'DISABLE_WP_CRON', true );

添加真正的任务。高级中,然后点击 Cron

  • 计划:*/5 * * * *
  • 标签:WordPress cron
  • 命令:cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now

不要跳过 DISABLE_WP_CRON 部分。两个都运行时,每个计划任务都可能触发两次:重复邮件、重复订单处理、订阅插件上的重复费用。使用 WP-Cron 部分中的一键操作,这不会发生在您身上。

WooCommerce 和后台队列

WooCommerce 使用后台队列处理订单状态变更、订阅续期、邮件和库存更新。它依赖 WP-Cron,因此这正是在访问量较少的商店上受影响的工作负载。

建立了真正的计划后,队列每五分钟处理一次。在 wp-admin 中的 WooCommerce状态计划操作处监视它。

高交易量的商店可以改用 */2 * * * *。低于该值很少有帮助:您花费的时间更多用于启动进程而不是工作。参见 设置 WooCommerce

管理现有任务

任务表显示标签计划命令最后运行状态,每一行有两个操作:

  • 禁用暂停任务而不删除它,并变为启用以将其恢复。当您测试任务是否导致问题时使用此功能。
  • 删除永久删除它。系统会要求您确认,计划的运行会立即停止。

删除 cron 任务无法撤销。计划从服务器上立即删除。如果您只想暂时停止它,请使用禁用

查找输出

Kapsule 创建的每个任务都会为您捕获其输出。标准输出和错误被追加到站点用户主目录中 cron-logs 目录中的日志文件,每个任务一个文件。

该日志回答了几乎所有"我的任务运行了吗?"的问题,因为它记录了命令打印的内容和它引发的任何错误。

要阅读它,请通过 SSH 连接并查看 ~/cron-logs/。SSH 使用密钥身份验证,因此首先需要从站点的文件选项卡添加您的公钥,然后点击 SSH 密钥标签:参见 添加 SSH 密钥

文件管理器和 SFTP 账户仅限于您的站点目录 ~/htdocs/yourdomain.co.nz,而 cron-logs 位于其上一级目录。这是有意的:它使具有 SFTP 访问权限的承包商无法访问网站以外的任何内容。使用原生 SSH 访问日志,或如下所示将输出重定向到您的站点目录。

如果您希望输出位于文件管理器可以打开的地方,请自行重定向:

cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now >> ~/htdocs/yourdomain.co.nz/wp-content/cron.log 2>&1

2>&1 将错误发送到与常规输出相同的文件。没有它,错误无处可去。

站点目录内的任何内容都可能通过网络请求。将重定向的日志放在 wp-content 下而不是站点根目录,给它一个没人会猜到的名称,并在您完成调试后删除它。

最佳实践

  • 错开您的计划。 六个任务都设置为 0 2 * * * 会同时启动。分散它们:0 210 220 2
  • 除非您真正需要,否则不要使用每分钟。 */5 对几乎所有事情都足够,包括 WordPress 和 WooCommerce。
  • 保持任务简短。 花费时间比其间隔更长的任务会与下一次运行重叠。
  • 重定向任何冗长内容的输出,以免一个啰嗦的任务填满您的磁盘。
  • 偶尔查看列表。 留下的来自已删除插件的任务会继续运行。

故障排除

任务似乎从未运行。 首先检查路径。打开日志文件。然后确认状态为活跃而不是已禁用。然后通过 SSH 运行相同的命令并查看它说什么。

日志中出现"command not found"。 缺少完整路径。使用 /usr/bin/php/usr/bin/wp/usr/bin/curl 而不是简单的名称。

权限被拒绝。 任务以您站点的系统用户身份运行。该用户需要拥有或至少能够读取命令接触的所有内容。在 使用文件管理器 中检查权限。

WordPress 任务仍然运行延迟。 确认交换的两个部分都已就位:计划存在于高级中,然后点击 Cron,且 DISABLE_WP_CRON 已设置。WordPress 标签上的 WP-Cron 部分显示两者的当前状态。

任务运行时站点速度变慢。 将其移至更安静的时间,或将工作分成更小的批次。站点级资源使用情况在性能下可见:参见 提高网站速度

插件更新后任务停止工作。 命令路径可能已更改。检查日志,然后通过删除旧任务并添加更正后的任务来从任务表中更新命令。

仍需帮助?

请发送邮件至 support@kapsulehost.com 或在 KPanel 中打开聊天。

打开 KPanel