2013-10-02 2 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); 

빠른 구글 내가 열 수있는 파일 디스크립터의 수를 증가 ulimit를 값을 설정해야 표시 오류

"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를 -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

시도했습니다. eachLimit과 eachSeries는 모두 오류를 전달합니다. 두 사람 중 누구도 나를 위해 잘 돌아갔다. 비록 각 시리즈가 동시에 처리하지는 않지만, 나는 여러 종류의 문제를 해결하고 있습니다. 고마워요 – nodeuser

관련 문제