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
v
ar 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()");
Actualización
Un comentario de Ajaxian, me ha dado una solución al usar un eval()
para ejecutar el código. Así podemos usarlo de una forma más cómoda sin perder la legibilidad de la función.
// Tarea programada jsCron.set("35 17 * * *", hola()) // de forma inline jsCron.set("35 17 * * *", function() { alert("Hola"); });
27 comentarios, 4 referencias
+
#