首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用node.js设置脚本的最大执行时间?

如何使用node.js设置脚本的最大执行时间?
EN

Stack Overflow用户
提问于 2013-03-03 00:15:45
回答 3查看 11.1K关注 0票数 6

我为我的用户提供了一种灵活的方法来使用在服务器端使用Node.js执行的JavaScript来转换数据。在这种设计中,有3个问题需要考虑:

  • 安全性:我使用sandbox解决了安全问题,以避免使用本机Node.js库。
  • 资源:我们可以使用v8选项--max_executable_size轻松设置最大内存使用量。关于CPU的使用,我会看看如何使用cpulimitrenice来管理它,现在已经无关紧要了。
  • time :我需要限制我的脚本的执行时间,以避免它们作为愤怒的僵尸运行。在这里我被卡住了。

我试过这样的方法:

代码语言:javascript
复制
 node -e '
    setTimeout(function() {
       console.log("timeout");
       process.exit;
    }, 5000);
    console.log("begin");
    while (1);
 '

但是这段代码只显示"begin",似乎我的超时从未被调用过。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-03 00:38:02

不幸的是,如果您的用户可以启动阻塞操作(如while(1)),那么就没有办法告诉Node一段时间后退出,因为阻塞操作将阻止setTimeout处理程序触发。或者确保用户发起的东西不会阻塞主循环,或者(这是一个非常糟糕的想法)使用某种外部自动终止/超时来破坏Node进程。

基本上,您可以使用Node来限制非阻塞代码的执行时间,但Node的全部意义在于阻塞代码会阻塞一切。如果您的用户确实能够运行任意代码,我会考虑在更高的级别上运行您的进程管理器/超时杀手器:例如,使用Node的exec工具生成带有终止超时的进程。

票数 6
EN

Stack Overflow用户

发布于 2014-06-10 05:09:31

你可能想看看tripwire (https://github.com/tjanczuk/tripwire)。这是一个可以杀死失控节点脚本的模块,您可以设置超时。它是一个本地节点模块,所以这是需要考虑的一件事,但它可以在Mac、Windows和Linux上工作。

票数 8
EN

Stack Overflow用户

发布于 2018-06-14 06:43:31

Node的built-in vm module提供了module.evaluatescript.runInContext和其他几种方法,这些方法将在沙箱环境中运行代码,并采用timeout选项来指定允许VM运行的最大时间(以ms为单位)。

请注意,在Node.js中运行不受信任的代码充满了潜在的安全问题。甚至VM模块也明确表示“ vm模块不是一种安全机制。不要使用它来运行不可信的代码。”(Here is one reason why not:运行vm.runInNewContext("this.constructor.constructor('return process')().exit()")看起来应该是无害的,但实际上它会导致节点终止。

代码语言:javascript
复制
const {VM} = require('vm2');

const vm = new VM({
    timeout: 1000,
    sandbox: {}
});

vm.run("process.exit()"); // throws ReferenceError: process is not defined
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15176599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档