Ejecutar tareas periódicas en Node con node-cron

Cron es una utilidad de programación que se ejecuta como un proceso demonio en el fondo de los sistemas tipo Unix. Es extremadamente popular para ejecutar tareas periódicas, que pueden...

¿Qué es Cron?

cron es una utilidad de programación que se ejecuta como un proceso daemon en el fondo de sistemas similares a Unix. Es extremadamente popular para ejecutar tareas periódicas, que pueden ser cualquier cosa que elija, como iniciar una copia de seguridad o borrar datos de una base de datos.

Puede agregar tareas a Cron a través de la línea de comando usando el comando crontab -e. El uso del argumento -e lo pondrá en modo de edición y abrirá su editor predeterminado donde puede agregar el trabajo. La sintaxis de un comando se ve así:

1
1 2 3 4 5 [USER] /path/to/command arg1 arg2

Los números del 1 al 5 representan diferentes incrementos de tiempo que puede especificar para programar el trabajo. Más detalles a continuación:

  • 1: Minuto (0-59)
  • 2: Hora (0-23)
  • 3: Día (0-31)
  • 4: Mes (0-12, donde 12 es diciembre)
  • 5: Día de la semana (0-7, donde el domingo es 0 o 7)

El argumento USER es opcional y se usa para especificar con qué usuario se debe ejecutar el comando. También puede especificar el usuario usando la opción -u. Hay muchas más opciones y variaciones de los parámetros de programación, pero no entraremos en más detalles aquí. Hay muchos otros recursos en Internet donde puede encontrar estos detalles.

Aquí hay un ejemplo simple de cómo programar un script para que lo ejecute Cron:

1
45 17 3 * * /path/to/script.sh

Luego, Cron ejecutaría este script a las 5:45 p. m. del tercer día de cada mes. Aunque la sintaxis puede ser un poco confusa al principio, en realidad es una forma muy poderosa de programar tareas repetitivas. Este formato ha sido adoptado por muchos programas y utilidades para especificar horarios.dq4

nodo-cron

¿Qué es? {#qué es}

La utilidad Cron se ha convertido en sinónimo de tareas de programación, por lo que nodo-cron obtuvo su nombre. En realidad, no utiliza ni interactúa con la utilidad Cron subyacente, sino que simplemente programa y ejecuta tareas periódicas para usted utilizando la función setTimeout() de Node. Lo hace analizando el programa de formato Cron que especifique, determina cuándo debe ser el siguiente 'tick' y establece el tiempo de espera en consecuencia.

Cómo usarlo

Para usar node-cron, deberá programar una función para que se ejecute mediante programación, lo que en realidad podría ser más conveniente para usted que tener que meterse con la línea de comando. Una función simple se puede programar así:

1
2
3
4
5
var cron = require('cron');

var job = new cron.CronJob('* * * * *', function() {
    console.log('Function executed!');
}, null, true);

Al ejecutar este código, verá el texto '¡Función ejecutada!' impreso en la consola una vez cada minuto.

Incluso puede ser un poco más elegante y especificar la zona horaria en la que se debe ejecutar la tarea. O, otra opción, es decirle a node-cron que no inicie el trabajo todavía. De esta manera, puede inicializar el trabajo y luego usar los métodos .start() y .stop() solo cuando lo necesite. Consulte la documentación completa para obtener una lista completa de parámetros y opciones.

Ventajas y desventajas {#ventajas y desventajas}

Personalmente, me gusta mucho node-cron debido a la facilidad con la que puede programar la ejecución del código mediante programación. Y dado que se ejecuta en Node, puede usarlo en cualquier sistema que admita Node (como Windows), y no solo en sistemas similares a Unix. Entonces, para lo que sea que lo estés usando, el código es más independiente del sistema de lo que sería si usara Cron directamente.

El mayor inconveniente, en mi opinión, es que, dado que no usa Cron debajo, no obtenemos la persistencia que tendríamos con Cron. Lo que quiero decir con esto es que en un reinicio del sistema, nuestro 'trabajo' ya no se ejecutará. En su lugar, tendrá que hacer un trabajo adicional para que el proceso del Nodo vuelva a ejecutarse, como configurarlo para que se ejecute al inicio colocándolo/vinculándolo en /etc/init.d/. No es muy difícil de hacer, pero tampoco es muy conveniente. nte.