2011-06-30 8 views
6

Me gustaría ejecutar un código js no confiable utilizando runInNewContext en node.js, pero por lo que veo no hay forma de limitar su tiempo de ejecución. También es una operación de sincronización. ¿Hay alguna manera de establecer el tiempo de espera en él o una versión asíncrona que me permita controlar su ejecución desde 'afuera'?nodejs: ¿Es posible evaluar el código js usando runInNewContext y limitar su tiempo de ejecución por un tiempo de espera?

ACTUALIZACIÓN: se ejecuta en un proceso externo no es bueno:

  • toma demasiados recursos
  • que es más importante, necesito el código para tener acceso a mis datos/código aunque entorno de pruebas

Respuesta

0

me gustaría para ejecutar un código JS que no se confía en el uso de runInNewContext Node.js pero por lo que veo no hay manera de limitar su tiempo de ejecución . También es una operación de sincronización. ¿Hay alguna manera de establecer el tiempo de espera en o en una versión asíncrona que me permita controlar su ejecución desde 'afuera'?

Creo que lo que dices es completamente cierto. Creo que la única opción es llenar un problema con Joyent/Ryan Dahl. Esperemos que puedan encontrar algo inteligente o tal vez te digan que no es posible.

De vm.runInNewContext:

cuenta que la ejecución de código no confiable es un negocio difícil que requiere gran cuidado . Para evitar fugas de variables globales accidentales, vm.runInNewContext es bastante útil, pero ejecutar con seguridad el código no fiable requiere un proceso por separado.

Para hacer esto de manera segura debe ejecutar un programa externo. Creo que la "parte costosa" puede evitarse al preforking.

Un solo proceso de control es responsable de iniciar los procesos secundarios que escuchan las conexiones y les sirven cuando llegan. Apache siempre intenta mantener varios procesos de servidor de repuesto o inactivos, que están listos para servir las solicitudes entrantes. De esta forma, los clientes no deben esperar para esperar a que se bifurquen los procesos secundarios nuevos antes de que se puedan atender sus solicitudes .

1

Ejecute el script en proceso externo usando dnode o child_process.fork, configure el temporizador de fecha límite y el proceso de eliminación si se alcanzó el tiempo de espera o el temporizador si el script finalizó.

+0

este tipo de desafía el propósito. Quiero ejecutar muchos de ellos y ciertamente no quiero ejecutar un proceso de sistema por cliente. también necesito proporcionar acceso a mis funciones internas a través del entorno de caja de arena –

+0

si es su código confiable y no bloqueante, luego verifique el indicador de temporizador al ingresar cualquier controlador y ejecute la devolución de llamada del manejador pasando el error de "tiempo de espera excedido". Si no puede confiar en el código, entonces el proceso externo es la única opción. No tiene que iniciar el proceso para cada llamada remota, no creo que sea un problema –

-2

Esto es posible ahora porque añadí timeout soporte de parámetros al módulo Nodo vm. Simplemente puede pasar un valor de tiempo de espera de milisegundos al runInNewContext() y arrojará una excepción si el código no termina de ejecutarse en el período de tiempo especificado.

Tenga en cuenta que esto no implica ningún tipo de modelo de seguridad para ejecutar código que no sea de confianza. Esto simplemente le permite agotar el tiempo de espera del código en el que confía o de lo contrario lo protege.

var vm = require("vm"); 

try { 
    vm.runInNewContext("while(true) {}", {}, "loop", 1000); 
} catch (e) { 
    // Exception thrown after 1000ms 
} 

console.log("finished"); // Will now be executed 

Exactamente lo que se puede esperar:

$ time ./node test.js 
finished 

real 0m1.069s 
user 0m1.047s 
sys  0m0.017s 
+0

Esto no parece funcionar. –

Cuestiones relacionadas