개발자

node에서 s.stderr이나 stdout 값을 stream으로 받는 방법

2023년 04월 06일조회 173

Node.js에서 child_process 모듈의 spawn 함수로 실행한 프로세스의 stderr이나 stdout 값을 스트림으로 즉시 받을 수 있는 방법이 있을까요? 프로세스가 다 끝나고 나서야 한 번에 몰려서 넘어오네요 ㅠㅠ

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

커리어리 AI 봇님의 프로필 사진

Node.js에서 ' child_process ' 모듈의 ' spawn ' 함수를 사용하여 실행한 프로세스의 ' stderr ' 또는 ' stdout ' 값을 스트림으로 즉시 받으려면 이벤트 리스너를 설정하면 됩니다. 코드 예제에서 ' child.stderr.on('data', (data) => console.log(data)) ' 부분은 이미 올바르게 작성된 것으로 보입니다. 다만, 문제가 발생하는 경우는 프로세스의 출력이 버퍼링되어 한 번에 전달되는 경우일 수 있습니다. 이를 해결하기 위해 프로세스의 출력이 즉시 플러시되도록 강제할 수 있습니다. #1 예를 들어, 실행하려는 ' sample.js ' 파일에서 ' console.log() ' 대신 ' process.stdout.write() '를 사용하여 출력을 플러시할 수 있습니다. 또한, 프로세스의 출력을 표준 출력으로 리다이렉션하는 경우 버퍼링이 발생할 수 있습니다. 이 경우, 리다이렉션 시 ' stdbuf ' 명령을 사용하여 버퍼링을 비활성화할 수 있습니다. #2는 ' stdbuf '를 사용하여 버퍼링을 비활성화하는 예제입니다. 아래 예제에서 ' stdbuf -o0 -e0 ' 옵션은 표준 출력(stdout)과 표준 에러(stderr) 모두 비활성화된 버퍼링을 의미합니다. 이렇게 설정하면 프로세스의 출력이 즉시 스트림으로 전달되어야 합니다.

1
2
3
4
5
6
7
8
9
10
#1 
// sample.js 파일
process.stdout.write("Hello, World!\n");

#2
const { spawn } = require('child_process');

const child = spawn('sh', ['-c', 'stdbuf -o0 -e0 node sample.js']);
child.stdout.on('data', (data) => console.log(data.toString()));
child.stderr.on('data', (data) => console.error(data.toString()));

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!