Cron
Moodle的Cron進程是必須在後台定期運行的PHP腳本(標準安裝過程的一部分)。Cron腳本可以在不同的計劃時間間隔運行不同的任務。
重要:設置伺服器時不要跳過設置Cron進程。如若跳過,你的Moodle站點可能不會正常運行。
特 殊的程序(一般稱作——這並不奇怪——Cron)用來在固定時間間隔運行Cron腳本。Cron腳本可以運行很多任務,包括郵件發送,報告更新,RSS源 更新,活動完成情況及發佈論壇消息等。因為不同的任務有不同的計劃時間,所以運行Cron腳本後不是每一個任務都會被執行。
Cron程序是 基於Unix系統(包括Linux和OSX)的核心部分,用來運行所有與時間相關的服務。在Windows系統上,最簡單的的解決方案是用Windows 任務計劃創建一個按照固定時間間隔運行的任務。如若是虛擬主機,需要找到如何在虛擬主機上配置Cron的相關文檔(或直接尋求支持)。
從本質上講,任務涉及到向系統中的Cron活動列表添加一行獨立的命令。在基於Unix的系統上,此列表名為「crontab」,為所有用戶共有。
綜合討論
根據伺服器的類型查閱後面的章節;這一章節包含一些基礎背景信息。
實質上部署Cron需要兩步:
- 確認將要執行的命令是否正確
- 找到執行命令的正確的地方
制定出Moodle的Cron命令
Moodle可以在安裝過程中使用2種不同的腳本來部署Cron。他們是:
- CLI (命令行解析器) 腳本。這將會在路徑:
- /path/to/moodle/admin/cli/cron.php
- 如若沒有疑問,這會是正確的可用腳本。但執行它還需要在電腦上安裝「PHP CLI」的程序。最終的命令類似於下面這條命令:
- /usr/bin/php /path/to/moodle/admin/cli/cron.php
- 嘗試着執行這條命令,查驗它是否能正常運行
- 基於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
根據伺服器類型選擇如下信息:
- 在Unix或Linux上設置Cron——各種Unix和Linux版本作業系統上的Cron服務。
- 在Windows上設置Cron——Windows上的Cron服務
- Apple 系統——內置的"crontab"服務與在Unix或Linux上設置Cron是一樣的。然而,可能你會想使用「蘋果方式」來啟動它——參閱在MAC系統上設置Cron。
- 使用Web服務商服務設置Cron——不同的Web服務商設置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論壇上的討論:
- Cron——誰可以給我一些有關Cron功能確認信息?
- Cronjob問題
- 放慢Cron:避免同時Cron進行
- cron.php的可視性(能見度)
- 如何在Windows上記錄計劃任務的輸出內容——當在Windows計劃任務遇到問題時,這個話題給出了一個不錯的、有用的想法,既是應該把計劃任務的輸出內容記錄到日誌文件中去。