2013-10-02 64 views
4

我试图在我的节点作业中使用ChildProcess.exec在async.forEach循环内运行一个命令。这里是代码Node.js spawn EMFILE

async.forEach(docPaths, function(docPath, callback) { 
var run = []; 
// some command using docPath variable here.. 
run.push(command); 
debugger; 
exec(run.join(' '), function(error, stdout, stderr){ 
    callback(); 
    }); 
}, callback); 

以下是错误

"stack":"Error: spawn EMFILE\ 
at errnoException (child_process.js:478:11)\ 
at ChildProcess.spawn (child_process.js:445:11)\ 
at child_process.js:343:9\ 
at Object.execFile (child_process.js:253:15)\ 
at child_process.js:220:18\ 

快速谷歌显示我需要设置的ulimit值,以增加文件描述符的数量可以是开放的。有些东西一样 “的ulimit -n 10000”。(从下面链接)

https://groups.google.com/forum/#!topic/nodejs/jeec5pAqhps

我在哪里可以增加这个..?还是有其他解决方案来规避这个问题?

感谢您的帮助..非常感谢!

回答

8

首先它不宜与ulimit混淆,因为它可能会对系统造成影响。

取而代之的是,由于您已经在使用异步,因此您可以使用limit paramater来限制并行执行次数。

async.eachLimit(docPaths, 100, function(docPath, callback) { 
var run = []; 
// some command using docPath variable here.. 
run.push(command); 
debugger; 
exec(run.join(' '), function(error, stdout, stderr){ 
    callback(); 
    }); 
}, callback); 

请做试错,并用合适的值替换100。

+0

据我所知,文件描述符ulimit被设置为纯粹为了追踪经典C++应用程序中的FD泄漏。因此,将节点应用设置为无限制应该是安全的,因为无论如何它在异步世界中都没有多大意义。 – alex

+0

@alex,它不是**安全**将ulimit设置为无限制,请参阅http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm以查看后果。 – Sriharsha

+0

我已尝试每个限制和每个系列都要通过错误。两者中的任何一个对我都很好。虽然每个系列不会同时处理,但它解决了我遇到的问题。非常感谢 – nodeuser

相关问题