Cron task on Windows Server

最近參與學校一個網站系統的架設、維護,網站架上學校的 server 後一直沒有出太大的問題,今天負責的指導老師突然找我過去,問我怎麼無法登入 Administrator,我 try 幾個比較可能的密碼,還是無法順利登入,伺服器設定沒有動過、昨天還有順利登入過,各種詭異,要趕車回家於是就跟老師說回去在試試看,有進度再回報。

回家吃完飯,用自己的電腦登入 Administrator,還是一直出現:

You have exceeded the maximum login attempts. This account has been locked for up to 5 minutes.

看來網站封鎖機制並非傳統網站系統針對 IP 或者塞 cookie 去防範,是直接凍結帳戶登入。

不過在學校出現這個 message 到回家已經是四個小時前的事情了,並非 5 minutes 左右的事情,查了一下可以在 phpmyadmin 中把 user 的 ‘logintries’ 資料值設定為 0,修改後可以順利登入。

不過這樣好像不太妙,我們有 Server 權限當然可以隨時進去 phpmyadmin 修改資料表,可是一般使用者一來沒有權限(請黑客們手下留情<(_ _)>) 二來開放之後,使用者一多,遇到這種問題就得進資料庫改值,會是一件很麻煩的事情。

在解決問題的討論串之中,有提到了問題發生的地方,問題貌似是出在一個叫作 cron 的東西。

到系統後臺果然發現 Site statistics 中的 Cron 狀態顯示為:cron is not running.

Google Developers 中是這麼解釋 Cron Service 的:

透過「應用服務引擎 Cron Service」,您可以定期設定排程工作;這些排程工作會依照您定義的時間或時間間隔執行作業,通常稱作「Cron 任務」。「應用服務引擎 Cron Service 」會自動觸發 cron 任務。舉例來說,您可以使用此服務每天寄送電子郵件報告、每 10 分鐘更新快取資料,或每小時更新摘要資訊。

簡單的說就是類似工作排程的東西,linux-base 系統是透過 crontab 去實現排程,不過學校 server 作業系統是 Windows Server 2008,當然沒有 crontab 指令可以用。

最後在萬能的 Stack Overflow 上面找到答案,用 Windows 系統中的工作排程器,不過 Stack Overflow 上面提供的方法是用 browser(瀏覽器) 去跑 cron,想了想好像會跑出很多視窗,於是又找了找,找到的解決方案就是用 Shell 調用 php.exe 去 run /lib/cron.php,問題即可迎刃而解。

Shell script (.bat) 內容大致上為:

php\php.exe your site\lib\cron.php

並在工作排程器中設定:

  1. 一般 > 不論使用者登入與否均執行(W)
  2. 觸發程序 > 新增(N) > 開始工作: 在排程上 > 設定 僅一次 > 進階設定 重複工作每隔 15 分鐘(自由設定,多久要 run 一次 cron 執行排程工作) > 持續時間: 不限制
  3. 動作 > 新增 > 程式或指令碼 Shell script(.bat)

問題應該就可以解決了!(cron 開始會處理凍結時間控管)