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

Ala*_*blo 5 execution-time node.js

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

  • 安全性:我使用沙箱解决了安全问题,以避免使用本机Node.js库.

  • 资源:我们可以使用v8选项轻松设置最大内存使用量--max_executable_size.关于CPU使用率,我将看到如何使用cpulimit或管理它renice,现在并不重要.

  • 时间:我需要限制我的脚本的执行时间,以避免它们作为hangry zombies运行.在这里,我陷入困境.

我尝试过类似的东西:

 node -e '
    setTimeout(function() {
       console.log("timeout");
       process.exit;
    }, 5000);
    console.log("begin");
    while (1);
 '
Run Code Online (Sandbox Code Playgroud)

但是这段代码只显示"开始",似乎我的超时从未被调用过.任何的想法 ?

Gle*_*ock 7

你可能想看看tripwire(https://github.com/tjanczuk/tripwire).它是一个可以杀死失控节点脚本的模块,您可以设置超时.它是一个本机节点模块,因此这是一件需要考虑的事情,但它适用于Mac,Windows和Linux.


Zac*_*c B 5

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

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