bestsource

노드 child_process를 사용하는 stdout 버퍼 문제

bestsource 2023. 10. 16. 21:56
반응형

노드 child_process를 사용하는 stdout 버퍼 문제

로컬 네트워크의 공유 폴더에서 JSON 파일(약 220Ko)을 가져오기 위해 노드 child_process를 사용하여 curl을 실행하려고 합니다.하지만 실제로는 내가 해결할 수 없는 버퍼 문제를 반환합니다.여기 내 코드가 있습니다.

var exec = require('child_process').exec;

var execute = function(command, callback){
    exec(command, function(error, stdout, stderr){ callback(error, stdout); });
};

execute("curl http://" + ip + "/file.json", function(err, json, outerr) {
    if(err) throw err;
    console.log(json);
})

그리고 여기 제가 받는 오류가 있습니다.

if(err) throw err;
          ^
Error: stdout maxBuffer exceeded.
    at Socket.<anonymous> (child_process.js:678:13)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:746:14)
    at Socket.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:408:10)
    at emitReadable (_stream_readable.js:404:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)
    at Pipe.onread (net.js:526:21)

를 사용하고 설정해야 합니다.maxBuffer사용시 옵션child_process.exec. 설명서에서:

maxBufferstdout 또는 stderr에서 허용되는 가장 큰 데이터 양을 지정합니다. 이 값이 초과되면 하위 프로세스가 삭제됩니다.

또한 문서에는 다음과 같은 기본값이 명시되어 있습니다.maxBuffer200KB 입니다.

예를 들어, 최대 버퍼 크기는 다음 코드에서 500KB로 증가합니다.

var execute = function(command, callback){
    exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){ callback(error, stdout); });
};

또한, 사용자가 수행하려는 작업을 수행할 수 있는지 확인하기 위해 에 대해 읽어 볼 수도 있습니다.

비슷한 문제가 있어서 exec에서 spon으로 이동하여 수정했습니다.

var child = process.spawn('<process>', [<arg1>, <arg2>]);

child.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

child.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

child.on('close', function (code) {
    console.log('child process exited with code ' + code);
});

답에 설명을 덧붙이고 있습니다.

exec 명령은 데이터를 상위 프로세스로 보내기 전에 버퍼링합니다.이것은 일반적으로 작은 출력을 생성하는 명령에 적합합니다.명령 실행으로 생성된 출력이 최대 버퍼 크기보다 크기 때문에 위 오류가 발생했습니다.위 문제를 해결하는 한 가지 방법은 팀 쿠퍼가 답변한 대로 버퍼 크기를 지정하는 것입니다.

var execute = function(command, callback){
exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){ 
 callback(error, stdout); });
};

또 다른 해결책은 일반적으로 exec에 비해 빠른 스폰 방법을 사용하는 것이며 전송하기 전에 데이터를 버퍼링하지 않습니다.데이터를 스트림으로 전송하기 때문에 버퍼 크기 문제가 발생하지 않습니다.Isampaio에서 사용하는 코드 조각입니다.

var child = process.spawn('<process>', [<arg1>, <arg2>]);
child.stdout.on('data', function (data) {
 console.log('stdout: ' + data);
});
child.stderr.on('data', function (data) {
 console.log('stderr: ' + data);
});
child.on('close', function (code) {
 console.log('child process exited with code ' + code);
});

가장 빠른 솔루션:

이 라인이 버퍼를 출력하는 경우:

childProc.stdout.on('data', (data) => console.log(data)); // <Buffer 1b 5b 34 6d>

다음으로 변경하면 됩니다.

childProc.stdout.on('data', (data) => console.log(`${data}`)); // bla bla bla

JS 콘솔에서 버퍼를 인코딩합니다.

또는 다음을 간단히 사용할 수 있습니다.console.log(data.toString()).

언급URL : https://stackoverflow.com/questions/23429499/stdout-buffer-issue-using-node-child-process

반응형