2016-12-23 5 views
2

ノードにはVM moduleがあり、新しいコンテキストで任意のJavaScriptコードを実行することができます。ノードVMコンテキストの実行を強制的に停止することはできますか?

私がしたいのは、このコードがコールバック関数で実行されるのを止める方法を見つけることです。コンテキストが停止できないという信頼できる方法です。

私が解決策を見つけようとしているトリッキーなサンプルです。

'use strict'; 

var vm = require('vm'); 

var src = '(' + (function(kill) { 
    try { 
     kill(); 
    } 
    catch (ex) {} 

    // Can this be prevented? 
    while (true) { 
     // Nothing. 
    } 
}) + ')'; 
var script = new vm.Script(src); 
var func = script.runInNewContext(); 

func(function() { 
    console.log('This should somehow stop that VM from running.'); 
}); 

try/catchステートメントは例外をキャッチするため、例外をスローするだけです。コールバックからスクリプトを停止することなく、コードは永久に実行されるダミーループに入ります(タイムアウトが設定されていてもそれまでのCPUサイクルを無駄にするまで)。

timeout VMの機能は私が望むものではありません。なぜなら、オンコマンドでスクリプトを停止したいからです。このコードを別のプロセスで実行してそのプロセスを終了させることができますが、それはオーバーヘッドを増やします。

私は本発明に関する発明的解決策に触れています。おそらく何かを使用してNode's Debug objects

答えて

1

可能な解決策の1つは、子プロセスでコードを実行することです。必要に応じて子プロセスを早期に終了することができます。無限ループの可能性がある場合は、主スクリプトのイベントループを飢えさせないように、とにかくこれを行うことをお勧めします。

+0

本当に、私は質問で、それはちょっとしたオーバーヘッドだと言いました。私は一般的にタイムアウトを持つことに問題はないので、不正なコードは完全にそれを消費しません。kill APIが呼び出された場合、それに頼らなければならないのは非効率的です。 –

関連する問題