我为我的用户提供了一种灵活的方法来使用在服务器端使用Node.js执行的JavaScript来转换数据。在这种设计中,有3个问题需要考虑:
--max_executable_size
轻松设置最大内存使用量。关于CPU的使用,我会看看如何使用cpulimit
或renice
来管理它,现在已经无关紧要了。我试过这样的方法:
node -e '
setTimeout(function() {
console.log("timeout");
process.exit;
}, 5000);
console.log("begin");
while (1);
'
但是这段代码只显示"begin",似乎我的超时从未被调用过。有什么想法吗?
发布于 2013-03-03 00:38:02
不幸的是,如果您的用户可以启动阻塞操作(如while(1)
),那么就没有办法告诉Node一段时间后退出,因为阻塞操作将阻止setTimeout
处理程序触发。或者确保用户发起的东西不会阻塞主循环,或者(这是一个非常糟糕的想法)使用某种外部自动终止/超时来破坏Node进程。
基本上,您可以使用Node来限制非阻塞代码的执行时间,但Node的全部意义在于阻塞代码会阻塞一切。如果您的用户确实能够运行任意代码,我会考虑在更高的级别上运行您的进程管理器/超时杀手器:例如,使用Node的exec工具生成带有终止超时的进程。
发布于 2014-06-10 05:09:31
你可能想看看tripwire (https://github.com/tjanczuk/tripwire)。这是一个可以杀死失控节点脚本的模块,您可以设置超时。它是一个本地节点模块,所以这是需要考虑的一件事,但它可以在Mac、Windows和Linux上工作。
发布于 2018-06-14 06:43:31
Node的built-in vm
module提供了module.evaluate
、script.runInContext
和其他几种方法,这些方法将在沙箱环境中运行代码,并采用timeout
选项来指定允许VM运行的最大时间(以ms为单位)。
请注意,在Node.js中运行不受信任的代码充满了潜在的安全问题。甚至VM模块也明确表示“ vm模块不是一种安全机制。不要使用它来运行不可信的代码。”(:Here is one reason why not:运行vm.runInNewContext("this.constructor.constructor('return process')().exit()")
看起来应该是无害的,但实际上它会导致节点终止。
const {VM} = require('vm2');
const vm = new VM({
timeout: 1000,
sandbox: {}
});
vm.run("process.exit()"); // throws ReferenceError: process is not defined
https://stackoverflow.com/questions/15176599
复制相似问题