2013-10-02 86 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

相關問題