2013-03-02 46 views
4

我给用户一种灵活的方式来使用JavaScript来转换数据,并在服务器端使用Node.js执行。与设计,有三个问题需要考虑:如何使用node.js设置脚本的最大执行时间?

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

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

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

我想是这样的:

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

但这个代码仅显示“开始”,似乎我的超时永远不会被调用。 有什么想法?

+0

这些是你的脚本吗?还是你想限制任意代码的执行?你是否想要在整个应用程序上设置一个时间限制?或者内部的一段代码? – Brad 2013-03-02 16:19:00

+0

我想限制其中一段代码的执行。 – 2013-03-02 16:20:23

+1

你的“while(1);”阻止执行,删除它,你会看到开始和超时。 – 2013-03-02 16:21:06

回答

3

不幸的是,如果您的用户可以启动阻止操作(如while(1)),则无法告诉节点在一段时间后退出,因为阻止操作将阻止处理器触发。要么确保用户启动的东西不会阻止主循环,要么(这是一个坏主意)使用某种外部自动kill/timeout来销毁节点进程。

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

+0

嗯,好的,在这种情况下,我会在'node'命令之前使用'timeout 5s',这也会导致我的流程失效。不管怎么说,还是要谢谢你。 – 2013-03-02 16:42:16

+0

如果你走这条路线,确保你的Node进程正在做的事情是:a)如果在操作过程中中止,它不会中断任何事情; b)不会在系统上留下未释放的资源(这发生在某些程序发送'kill -9'时)。 – 2013-03-02 16:45:06

+0

实际上,我使用的[sandbox](http://gf3.github.com/sandbox/)完成了你正在谈论的事情(我看到一些超时后的高管和sigkills,由父进程管理)。没有看到它,因为所有的例子都使用了默认值......不管怎么样。 – 2013-03-02 18:24:59

7

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

+0

我的问题现在有点老,但你的答案看起来很有趣。 – 2014-06-09 21:46:44

+0

@AlainTiemblo哈哈我现在明白了。这是从我的团队中刚刚发现此问题的人员那里传给我的。现在,任何人都可以在那里搜索。 :p – 2014-06-10 01:12:16

+1

是的,这就是为什么“Necromancer”徽章存在的原因:-)一些新的答案可以更好地适应旧问题。感谢分享。 – 2014-06-10 07:27:28