Ejecutar procesos periódicamente con cron

Típicamente el funcionamiento de un sitio Prontus requiere la ejecución periódica de algunos procesos, como la actualización de los índices del buscador Prontus, la actualización de portadas según la fecha de publicación o expiración de artículos, y otros. Para este propósito te sugerimos usar el comando cron.

Publicado: Martes 25 de septiembre de 2018 por Adriano Varoli Piazza
Última modificación: Viernes 12 de abril de 2019
Funcionamiento

El software cron es un comando estándar de Unix/Linux que te permite agendar la ejecución periódica de procesos, por ejemplo cada día, hora, minuto, semana o mes.

Cron se compone de crond, un proceso automático o daemon de sistema, que lee un archivo de configuración llamado crontab que específica comando shell para ejecutarse periódicamente a una hora específica.

Cada línea de un archivo crontab representa un proceso a ejecutar con una cierta periodicidad, y está formada por una expresión CRON, seguida por el comando shell a ejecutar.

Para agregar, quitar o modificar tareas, hay que editar el crontab. Esto se hace con la orden crontab -e, que abrirá el editor definido en la variable de entorno EDITOR y cargará el fichero crontab correspondiente al usuario que está logueado. Por ejemplo, si tu webserver tiene asignado el usuario www-data, una manera de editar el crontab correcto sería la siguiente:

miusuario $ su www-data
www-data $ crontab -e

El comando crontab -e abrirá el editor de texto del sistema y te mostrará la estructura del archivo crontab para el usuario actual (en el ejemplo, www-data). La configuración de cron se actualizará al guardar y cerrar el archivo.

Puedes ver el contenido actual del crontab de un usuario con el comando crontab -l.

Formato del archivo crontab

Un archivo crontab normalmente tiene la siguiente estructura:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# formato de comandos
#.--------------- minuto (0-59) #| .------------ hora (0-23) #| | .--------- día del mes (1-31) #| | | .------ mes (1-12) o jan,feb,mar,apr,may,jun,jul... (meses en inglés) #| | | | .--- día de la semana (0-6) (domingo=0 ó 7) o sun,mon,tue,wed,thu,fri,sat (días en inglés) #| | | | | #* * * * * comando a ejecutar
01 * * * * perl /var/www/misitio.cl/cgi-cpn/prontus_cron_fechas.cgi miprontus
50 0 * * * perl /var/www/misitio.cl/cgi-cpn/prontus_indexer.cgi miprontus

Las primeras cuatro líneas permiten especificar, respectivamente

  • SHELL: el shell a usar para ejecutar los comandos
  • PATH: el path a usar para buscar comandos ejecutables si no especificas una ruta absoluta
  • MAILTO: un email al que enviar la salida a pantalla emitida por los comandos ejecutados
  • HOME: el directorio a usar como base al ejecutar los comandos

Luego de esas líneas debes ingresar los comandos a ejecutar en sí, con el formato como se describe en el código arriba: primero especificas cuándo debe correr cada proceso (por ejemplo al minuto 10 de la hora 05 de todos los días, o cada hora del día lunes de cada semana, y luego escribes el comando a ejecutar. Puedes especificar múltiples valores para los campos de minuto, hora, etc. separándolos con ,, de este modo:

10,20 02,03 * * * miscript 

indica un proceso que debe correr a las 02:10, 02:20, 03:10 y 03:20.

Puedes encontrar más detalles sobre el formato del archivo crontab en páginas como ésta.

Procesos Prontus en cron

Hay algunos procesos Prontus que normalmente querrás agregar al crontab:

  • prontus_indexer.cgi: este proceso actualiza los índices del buscador Prontus cuando agregas, modificas o eliminas artículos. Normalmente puede correr dos veces al día, pero puedes aumentar o disminuir la frecuencia según las necesidades de tu sitio.
  • prontus_cron_fechas.cgi: esta CGI actualiza las portadas y portadas automáticas (taxonómicas, tags, etc) según la fecha de publicación y expiración que especifiques para tus artículos. Si un artículo tiene alta, pero fecha de publicación en el futuro, no se mostrará en las portadas en que lo incluyas hasta esa fecha. Si un artículo tiene alta y fecha de expiración especificada, no se mostrará en las portadas en que se encuentre luego de esa fecha. Este proceso depende de que esté activa la configuración CONTROL_FECHA en el archivo /[nombre del prontus]/cpan/[nombre del prontus]-var.cfg. Este proceso normalmente corre una o dos veces al día.

Este es un ejemplo de un archivo crontab funcionante:

MAILTO=root
# m h dom mon dow command
# Indexacion de los buscadores
0 12,18 * * * /usr/bin/nice /usr/bin/perl /var/www/develop.prontus.cl/web/cgi-cpn/prontus_indexer.cgi prontus_desarrollo_v12_0

# cron fechas: el último parámetro es un listado de portadas separado por '/'
30 1 * * * /usr/bin/nice /usr/bin/perl /var/www/develop.prontus.cl/web/cgi-cpn/prontus_cron_fechas.cgi prontus_desarrollo_v12_0 inicio.html/noticias.html

Ese crontab especifica que debe indexarse el Prontus "prontus_desarrollo_v12_0" todos los días a las 12:00 y 18:00, y que debe ejecutarse el proceso de control de fechas para el mismo Prontus todos los días a la 01:30.

Puedes ver un listado de los procesos que actualmente se encuentran en el crontab para tu webserver en la página Administrar Sistema Listado de Crons en el panel de administración de Prontus.

Artículos Relacionados