En un momento de aburrimiento he estado implementado una versión de Cron para Javascript. Para los que no lo sepan, Cron es una utilidad del sistema Unix que permite programar tareas a lo largo del tiempo. Una de las utilidades más usadas para tareas como copias de seguridad, envío de mails, …
Para Javascript he pensado que sería interesante usar la misma estructura cron usa en el fichero crontab, donde se almacena la lista de tareas programadas.
35 17 * * * hola()
Hagamos un pequeño repaso a los parámetros de Cron (por orden):
- minuto [0-59]
- hora [0-23]
- dia del mes [0-31]
- mes [0-12]
- dia semana [0-7]
- ejecutable
Los * indican cualquier, por lo tanto en el ejemplo anterior indicamos que cada día a las 17:35 se ejecutará el script hola().
La hora especificada será la del navegador del usuario
Veamos unos ejemplos más:
* 16 * * * hola()
Cada día desde las 16:00 a las 16:59 se ejecutará hola().
30 6 1 * * showHola()
Ejecutamos showHola() el día 1 de cada mes a las 6:30 de la mañana.
Se trata de un sistema bastante rudimentario, pero funciona y aunque operadores como (/2) no están contemplados, dan mucho juego.
Codigo
var jsCron = { items:[], interval: null, parse: function(strUnix) { return strUnix.match(/^(\d+|\*) (\d+|\*) (\d+|\*) (\d+|\*) (\d|\*) +(\w+)/); }, check: function() { var hoy = new Date(); var test = [new Date(), hoy.getMinutes(), hoy.getHours(), hoy.getDate(), hoy.getMonth(), hoy.getDay()]; for (var i in this.items) { var exec = 0; var t = this.parse(this.items[i][1]); for (var x in t) if (t[x] && (t[x] == test[x] || t[x] == "*"))exec++; if (exec == 5 && this.items[i][0] == 0) { eval(t[6]).call(); this.items[i][0] = 1; } else if (exec < 5 && this.items[i][0] == 1) { this.items[i][0] = 0; } } }, set: function(strUnix) { if (!/^(\d+|\*) (\d+|\*) (\d+|\*) (\d+|\*) (\d|\*) +(\w+)/.test(strUnix)) return new Error("Formato invalido"); this.items.push([0, strUnix]); }, init: function(seg) { var seg = seg || 1000; this.interval = setInterval("jsCron.check()", seg); } }; jsCron.init();
Modo de uso
Al igual que de un crontab debemos especificar un listado de tareas a programar, para ello usaremos el método set() e introduciremos la sentencia en el formato explicado anteriormente.
// Función hola();
function hola() {
alert("Hola");
}
// Tarea programada
jsCron.set("35 17 * * * hola()");






