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論壇上的討論: