如何對 Drupal 的 cron 做 Debug

注意
這篇文章是 Drupal 6 的時代寫的, 並沒有在後續版本測試過.

Drupal's cron

Drupal 的 cron 是個好用的東西, 但有時候出問題時也很難 debug, 當看到這幾個訊息時, 通常是上次的 cron 執行失敗了.

1Attempting to re-run cron while it is already running.  
2Cron run exceeded the time limit and was aborted.  
3Cron has been running for more than an hour and is most likely stuck.

Debug 方法

在 variable 裡面, 有兩個相關參數, cron_last 是上次執行的時間, cron_semaphore 是代表 cron 正在執行. 所以如果執行 cron 的途中系統掛了, 可能就得手動清掉 semaphore, 不然即使你手動執行 cron, 系統也會回應已經有一個 cron 在執行了. 可用下列指令:

1DELETE FROM variable WHERE name="cron_semaphore";  

另外如果要看 cron 是執行到哪裡出問題了, 可修改 includes/module.inc

 1   foreach (module\_implements($hook) as $module) {  
 2    $function = $module .'\_'. $hook;  
 3    if ($hook == 'cron') watchdog('cron', "hit $module cron");   // add this line  
 4    $result = call\_user\_func\_array($function, $args);  
 5    if (isset($result) && is\_array($result)) {  
 6      $return = array\_merge($return, $result);  
 7    }  
 8    else if (isset($result)) {  
 9      $return\[\] = $result;  
10    }  
11  }

執行結果

如下, 可以看出 cron 執行到哪裡了.

Drupal cron