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

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

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

  • 资源:我们可以使用v8选项--max_executable_size轻松设置最大内存使用量。 关于CPU的使用情况,我会看看如何使用cpulimitrenice来pipe理它,现在并不重要。

  • 时间:我需要限制我的脚本的执行时间,以避免他们作为僵尸僵尸运行。 在这里,我卡住了。

我尝试了这样的:

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

但是这个代码只显示“开始”,似乎我的超时从来没有被调用过。 任何想法 ?

不幸的是,如果你的用户可以启动阻塞操作(比如while(1) ),那么在一段时间之后就没有办法告诉Node退出,因为阻塞操作将阻止setTimeout处理器的触发。 要么确保用户启动的东西不会阻塞主循环,要么(这是一个非常糟糕的主意)使用某种外部自动杀/超时来销毁节点进程。

基本上,您可以使用Node来限制非阻塞代码的执行时间,但是Node的全部内容是阻塞代码阻塞了一切。 如果你的用户真的能够运行任意代码,我会考虑在更高的层次上运行你的进程pipe理器/超时杀手,例如,使用Node的exec工具产生kill超时的进程。

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