Configurar cron en Drupal 9

Drupal y cron juntos

Cron, para algunos algo conocido, y a otros les sonara a chino. Pero cron es algo sencillo, y muy útil, es un daemon de sistemas Unix (Linux y Mac entre otros) que permite programar y automatizar tareas para que se ejecuten en intervalos específicos.

Crontab

Crontab es el programa que se utiliza para poder añadir, editar, eliminar o listar las tareas de cron por consola (no tiene interfaz gráfica).

Su uso básico es muy sencillo, tenemos la opción -l para listar, y la opción -e para editar las tareas cron, esta opción nos abrirá un editor de textos para poder modificar las tareas.

Tareas de cron

Una tarea de cron puede tener este aspecto:

0 * * * * ping https://escueladrupal.com

Ahora, que hace esta tarea? Realiza un ping a la url https://escueladrupal.com a las 00 de cada hora, es decir, a las 12:00, 13:00, 14:00… Poder programar nuestras tareas en fechas especificas es muy sencillo, podemos fijarnos en la siguiente tabla:

# +---------------- minutos (0 - 59)
# |  +------------- horas (0 - 23)
# |  |  +---------- días del mes (1 - 31)
# |  |  |  +------- mes (1 - 12)
# |  |  |  |  +---- día de la semana (0 - 6) (Domingo = 0)
# |  |  |  |  |
  *  *  *  *  *  Comando a ejecutar

Como vemos, el primer asterisco, corresponde a los minutos, por eso, la tarea que hemos puesto de ejemplo, se ejecuta a en punto, por que tiene un 0.

Pero claro, a si solo podemos programarlas para que se ejecuten en un momento concreto, a las 12:00, pero y si queremos que se ejecuten cada 15 minutos? Pues se hace asi:

*/15 * * * * ping https://escueladrupal.com

Esto ejecutara el ping a las 12:00, 12:15, 12:30… Tenemos otras opciones, como guion (–) para rangos, o la coma (,) para distintos valores:

0-5 10,11,12 * * * ping https://escueladrupal.com

Esta tarea realizara el ping a las 10:00, 10:01, 10:02, 10:03, 10:04, 10:05, 11:00… cada minutos de los primeros 5 de las 10, 11 y 12.

Cron en Drupal

Basta de ejemplos de tareas cron, ahora, como podemos ejecutar cron en Drupal? Tenemos 2 formas, utilizando los módulos del core, que ejecutaran cron en los intervalos especificados en su configuracion (/admin/config/system/cron) o llamando a una url y creando la tarea de cron en el crontab.

Para crear la tarea de cron para que se ejecute cuando queramos, primero debemos obtener la url de cron, esta url esta especificada en /admin/config/system/cron y tendra uno de los siguientes formatos:

Drupal 8 http://www.example.com/cron/[key]

Drupal 7 http://www.example.com/cron.php?cron_key=[key]

Ahora que tenemos la url, creamos la tarea cron utilizando crontab -e:

0 * * * * wget -O - -q -t 1 http://www.example.com/cron/<key>

Esto ejecutara el cron de nuestro sitio cada hora, podemos poner los intervalos que queramos.

Crear una tarea cron personalizada en Drupal

Para implementar un cron propio en drupal, debemos crear un modulo, y utilizar hook_cron, aquí esta el código de dblog_cron, que es el hook_cron implementado por el modulo dblog:

function dblog_cron() {
  // Cleanup the watchdog table.
  $row_limit = \Drupal::config('dblog.settings')->get('row_limit');
  // For row limit n, get the wid of the nth row in descending wid order.
  // Counting the most recent n rows avoids issues with wid number sequences,
  // e.g. auto_increment value > 1 or rows deleted directly from the table.
  if ($row_limit > 0) {
    $min_row = db_select('watchdog', 'w')->fields('w', [
      'wid',
    ])->orderBy('wid', 'DESC')->range($row_limit - 1, 1)->execute()->fetchField();
    // Delete all table entries older than the nth row, if nth row was found.
    if ($min_row) {
      db_delete('watchdog')->condition('wid', $min_row, '<')->execute();
    }
  }
}
Comparte este artículo:
Publicado por Borja
Image

Me metí en la aventura de Drupal con la versión 6, y aquí estoy, 10 años después, escribiendo articulos y haciendo videos sobre Drupal, quien me lo iba a decir. Aunque he probado otros framworks y cms, me quedo con Drupal de lejos, pero Symfony y Django estan entre mis favoritos. Aficionado a la montaña, la bicicleta, y el comer, de eso que no falte.