Cómo resolver problemas con el cron.php de Drupal

Otro apunte sobre Drupal. La ejecución del cron de Drupal puede fallar por diversas causas, y cuando el cron no se ejecuta, muchas tareas de mantenimiento, envío de boletines, notificaciones, sitemaps, etc. no funcionarán así que es un tema importante descubrir porqué puede fallar, especialmente si la ejecución directa con http://nombredelsitio/cron.php tampoco funciona.

Enlazo el post de drupal.org que explica algunas cosas que podemos hacer para averiguar porqué no funciona el cron de nuestro site, debugar la ejecución del cron si hace falta, y corregirlo para que no vuelva a fallar.

Me apunto las selects para limpiar las caches con SQL directamente desde la base de datos:

delete from cache_block;
delete from cache_content;
delete from cache_filter;
delete from cache_form;
delete from cache_menu;
delete from cache_mollom;
delete from cache_page;
delete from cache_update;
delete from cache_views;
delete from cache_views_data;

Selects para comprobar si para Drupal el estado del Cron es 'aún en ejecución':

select * from variable where name like 'cron%';

Y si hay variables que comienzan por cron, eliminarlas para desbloquearlo:

delete from variable where name like 'cron%';

Tampoco debería haber ningún registro en la tabla semaphore:

select * from semaphore;
delete from semaphore;

Si el cron falla porque un contenido a indexar para el buscador interno de Drupal tiene algo raro que lo hace petar, el contenido estará pendiente de indexar, y con esta select se puede averiguar qué nodos de Drupal aún no se han indexado en el buscador interno:

SELECT *
FROM node n
LEFT JOIN search_dataset d
       ON d.type = 'node'AND d.sid = n.nid
WHERE n.status = 1 AND n.type IN ('blog', 'page') 
      AND (d.sid IS NULL OR d.reindex > 0)

 

Si todo esto falla, toca revisar módulo por módulo hasta dar con el que provoca el error que hace petar el cron. La propuesta es ir desactivando uno por uno los que utilizan el Cron hasta dar con el culpable y encontrar el error.

Para saber qué módulos utilizan el cron, ordenados por orden de ejecución, se puede utilizar este código php creando, por ejemplo, una página de Drupal con el código como contenido, seleccionando tipo de formato php, y llamándola desde el navegador, o simplemente darle al botón de vista previa en lugar de guardar, para no dejar páginas guardadas con código php incrustado:

<?php
   echo theme('item_list', module_implements('cron'));
?>

 

La última vez que me falló el cron de Drupal me costó bastante encontrar lo que pasaba, así que lo comento aquí por si le pasa a alguien más, y también para acordarme.

Me pasaba con una instalación de Drupal 6, y resulta que revisando módulo por módulo el cron fallaba siempre que tenía activado el módulo feeds, o el módulo masquerade. Desactivando los módulos volvía funcionar, pero no era cuestión de tener que activar y desactivar el módulo feeds cada vez que quisiera hacer una importación de contenidos de feeds.

¿El problema? Pues he visto que donde falla el cron es en el paso de comprobar las actualizaciones para módulos de Drupal. No sé porqué está fallando, pero si desactivo el módulo 'Update status' de los módulos opcionales del core ya pueden coexistir el módulo feeds, el módulo masquerade y la ejecución del cron.

Controlar el estado de las versiones de los módulos es importante, pero cuando las versiones tienen mantenimiento. Como la versión 6 de Drupal ya no tiene soporte tampoco tiene mucho sentido buscar actualizaciones en cada ejecución del cron, porque no las va a encontrar.

Próximo paso, migrar a Drupal 7 :)