javascript - nodejs - npm child_process




Node.js의 표준 출력 child_process exec가 짧게 잘라졌습니다. (2)

나는 executstdout.on ( 'end') 콜백을 @damphat 솔루션으로 영원히 멈추게했다.

또 다른 해결책은 exec의 옵션에서 버퍼 크기를 늘리는 것입니다 : here 의 문서를 here

{ encoding: 'utf8',
  timeout: 0,
  maxBuffer: 200*1024, //increase here
  killSignal: 'SIGTERM',
  cwd: null,
  env: null }

quote : maxBuffer는 stdout 또는 stderr에 허용되는 최대 데이터 양을 지정합니다.이 값을 초과하면 하위 프로세스가 종료됩니다. 나는 이제 다음을 사용한다 : 이것은 받아 들인 해결책과는 대조적으로 덩어리의 분리 된 부분을 표준 출력에서 ​​쉼표로 분리하여 처리 할 필요가 없다.

exec('dir /b /O-D ^2014*', {
    maxBuffer: 2000 * 1024 //quick fix
    }, function(error, stdout, stderr) {
        list_of_filenames = stdout.split('\r\n'); //adapt to your line ending char
        console.log("Found %s files in the replay folder", list_of_filenames.length)
    }
);

Node.js에서 child_process 모듈의 exec 명령을 사용하여 Java에서 알고리즘을 호출하여 많은 양의 텍스트를 표준 출력 한 다음 구문 분석하여 사용합니다. 대부분 캡처 할 수 있지만 특정 수를 초과하면 내용이 잘립니다.

exec("sh target/bin/solver "+fields.dimx+" "+fields.dimy, function(error, stdout, stderr){
    //do stuff with stdout
}

setTimeouts 및 콜백을 사용하여 시도했지만 성공하지 못했지만 코드를 완전히 검색하기 전에 stdout을 참조하기 때문에이 문제가 발생한다고 생각합니다. 나는 stdout이 사실상 데이터 손실이 발생하는 곳이라는 사실을 테스트했다. 더 이상 비동기 적 문제가 아닙니다. 필자는 또한 로컬 컴퓨터와 Heroku에서이 문제를 테스트했으며 똑같은 문제가 발생할 때마다 정확히 같은 줄 번호에서 자릅니다.

이것에 도움이 될만한 아이디어 나 제안은 무엇입니까?


이 문제에 대한 실제 (그리고 최선의) 해결책은 exec 대신 spawn을 사용하는 것입니다. 이 기사에서 설명한 것처럼 스폰은 대용량 데이터를 처리하는 데 더 적합합니다.

child_process.exec는 자식 프로세스의 전체 버퍼 출력을 반환합니다. 기본적으로 버퍼 크기는 200k로 설정됩니다. 자식 프로세스가 그 이상을 반환하면 "Error : maxBuffer exceeded"라는 오류 메시지와 함께 프로그램이 중단됩니다. exec 옵션에서 더 큰 버퍼 크기를 설정하여이 문제를 해결할 수 있습니다. 하지만 exec는 거대한 버퍼를 Node로 반환하는 프로세스를위한 것이 아니기 때문에 그렇게하지 않아야합니다. 당신은 그것에 대해 스폰을 사용해야합니다. exec를 위해 무엇을 사용합니까? 이를 사용하여 데이터 대신 결과 상태를 반환하는 프로그램을 실행합니다.

spawn은 exec와는 다른 구문을 필요로합니다 :

var proc = spawn('sh', ['target/bin/solver', 'fields.dimx', 'fields.dimy']);

proc.on("exit", function(exitCode) {
    console.log('process exited with code ' + exitCode);
});

proc.stdout.on("data", function(chunk) {
    console.log('received chunk ' + chunk);
});

proc.stdout.on("end", function() {
    console.log("finished collecting data chunks from stdout");
});






child-process