Cron

来自MoodleDocs
跳转至:导航、​搜索

Moodle的Cron进程是必须在后台定期运行的PHP脚本(标准安装过程的一部分)。Cron脚本可以在不同的计划时间间隔运行不同的任务。

重要:设置服务器时不要跳过设置Cron进程。如若跳过,你的Moodle站点可能不会正常运行。

特 殊的程序(一般称作——这并不奇怪——Cron)用来在固定时间间隔运行Cron脚本。Cron脚本可以运行很多任务,包括邮件发送,报告更新,RSS源 更新,活动完成情况及发布论坛消息等。因为不同的任务有不同的计划时间,所以运行Cron脚本后不是每一个任务都会被执行。

Cron程序是 基于Unix系统(包括Linux和OSX)的核心部分,用来运行所有与时间相关的服务。在Windows系统上,最简单的的解决方案是用Windows 任务计划创建一个按照固定时间间隔运行的任务。如若是虚拟主机,需要找到如何在虚拟主机上配置Cron的相关文档(或直接寻求支持)。

从本质上讲,任务涉及到向系统中的Cron活动列表添加一行独立的命令。在基于Unix的系统上,此列表名为“crontab”,为所有用户共有。

综合讨论

根据服务器的类型查阅后面的章节;这一章节包含一些基础背景信息。

实质上部署Cron需要两步:

  1. 确认将要执行的命令是否正确
  2. 找到执行命令的正确的地方

制定出Moodle的Cron命令

Moodle可以在安装过程中使用2种不同的脚本来部署Cron。他们是:

  1. CLI (命令行解析器) 脚本。这将会在路径:
    •  /path/to/moodle/admin/cli/cron.php
    •  如若没有疑问,这会是正确的可用脚本。但执行它还需要在电脑上安装“PHP CLI”的程序。最终的命令类似于下面这条命令:
    • /usr/bin/php /path/to/moodle/admin/cli/cron.php
    • 尝试着执行这条命令,查验它是否能正常运行
  2. 基于Web的脚本。需要在Web浏览器上运行脚本,并能访问类似于http://your.moodle.site/admin/cron.php的地址。最终能够找到的基于Web浏览器(如,wget)的命令行可能会类似于如下代码:
  • /usr/bin/wget http://your.moodle.site/admin/cron.php
  • 这样做的优势是可以在“任何地方”执行脚本。如果你电脑不能正常运行,那么你就可以去其他地方执行脚本。

找到执行命令的正确的地方

命 令放在什么地方确实取决于正在使用的系统,找到并阅读系统平台或服务商的相关文档以谋求解决方案。大多数情况下,Cron执行的是包含有建立的正确命令 (如上所示)并把它添加到计划任务中去,到预定时间之时即可执行命令并对文件进行排序。这也许通过一个特定的用户界面既可做到,或者也可直接通过编辑文件 目录。

如果使用CLI来执行Cron的话,首先要确保执行Cron进程的用户是正确的。Web版本则不会有这种问题。

例如,在Ubuntu/Debian等Linux系统上安装Cron后,假设以root身份登录系统:

使用crontab命令为用户www-data打开crontab编辑器。下面命令为在基于Debian系统上的Apache执行cron

$ crontab -u www-data -e

上述命令会打开一个编辑窗口。如需每一分钟运行一次CLI Cron脚本,添加下面这行命令:

*/1 * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php >/dev/null

注意:命令最后的 >/dev/null 是把所有输出都发送到“bin”并阻止每一分钟就接受一封邮件。

在系统上设置Cron

根据服务器类型选择如下信息:

这里还有更多关于特殊主机设置Cron的说明(请检查他们是否已经过时):

使用第三方Cron服务

除了上述部署在自己服务器上Cron服务之外,还可以使用第三方Cron服务(通常称之为webcron):

  • EasyCron——一个webcron提供商,有了它,无需再使用crontab或其他任务调度程序来设置cron job。

设置Moodle内的Cron

下面是一些Moodle内关于Cron操作方面的设置:

  • 设置Cron——Cron进程的密码及CLI设置。

远程Cron

采用基于Web版本的Cron可以极其完美的把Cron进程放在与Moodle服务器不同的地方。例如,Unix服务器上的Cron服务可以调用基于Moodle服务器的Windows上的Cron Web页面以进行操作Cron。

为数个Moodle服务器执行Cron

  • 如果所有的服务器均为Web服务器且他们共同服务于一个Moodle站点(某种类型的集群服务器),那么只有一个服务器可以执行Cron job。
  • 如果其中2台Web服务器运行了2个不同的Moodle站点,那么每个站点都均需要一个Cron job。(即便是一个单独的Apache Web服务器也可以通过虚拟主机功能使用不同的域名来运行不同的Moodle站点,参见:https://httpd.apache.org/docs/2.2/vhosts/index.html。)
  • 如果你指的是这个设置:https://moodle.org/mod/forum/discuss.php?d=238005,它是说一台Web服务器和一个Moodle实例。那么一个Cron job是对的。
  • 参阅这个论坛主题

Moodle 2.7+的Cron

Cron获得了重大更新,现在可以支持计划内与计划外的任务了——[https://tracker.moodle.org/browse/MDL-25499 MDL-25499]。这些改变的益处是:

  • 管理员可以配置每个任务的日程。参见计划任务
  • 任务可以同时进行
  • 任务进程可以锁定以防同一个任务在同一时间被不同的进程执行

这样处理带来的结果就是Cron可以更为频繁的执行,这意味着(例如)论坛帖子可以更快地发送出去。管理员可以像之前一样保持同一时间执行Cron,但是还是强烈建议把执行Cron的频率增加到至少每分钟一次。

调试计划任务

有时,特定的Cron任务不能正常运行。在Moodle 2.7之前的版本——任何不能正常运行的任务都会抛出异常以阻止其他Cron运行。检测每一次Cron是否完成的唯一方式是在执行Cron时添加一些自动检查的输出内容(如,搜索字符串“Cron完成于”)。

在Moodle 2.7及以后的版本,一个失败的计划任务不会阻止完成其他待办任务。当一个任务失败时,它会被标记为失败并计划重新尝试运行。如果重新尝试后任务依旧失败,那么下一次的计划时间会推后至最长到每24小时执行一次。检查计划任务管理员页面,就会明白如何判断任务是失败的(失败的任务计划时间肯定会有延迟——重新尝试运行失败的任务时肯定会有数秒的等待时间)。调试失败的任务的简单方法是使用CLI计划任务执行程序并检测输出结果。

另请参阅

Moodle论坛上的讨论: