Node.js에서 child_process 모듈은 자식 프로세스를 생성하고 관리하는 데 사용됩니다. 이 모듈은 다양한 기능을 제공하여 다른 요구 사항을 충족시킵니다. 주요 함수로는 `spawn()`, `fork()`, `exec()`, `execFile()` 및 이들의 동기 버전이 있습니다. 각각에 대한 간략한 개요는 다음과 같습니다.
spawn()
사용법: `child_process.spawn(command, [args], [options])`
목적: 길고 지속적인 프로세스에 적합하며, 많은 양의 데이터를 처리하는 데 사용됩니다. 명령을 실행하기 위해 쉘을 생성하지 않아 조금 더 효율적입니다.
데이터 처리: `stdout`과 `stderr`를 통해 데이터를 스트림합니다.
`child_process`를 생성하는 과정 및 파이프 연동
const { spawn } = require('child_process');
const child = spawn('wc');
process.stdin.pipe(child.stdin)
child.stdout.on('data', (data) => {
console.log(`child stdout:\n${data}`);
});
정상적인 종료가 되었을 때 수행되는 에미터
child.on('exit', function (code, signal) {
console.log('child process exited with ' +
`code ${code} and signal ${signal}`);
});
시스템 출력 및 에러 출력
child.stdout.on('data', (data) => {
console.log(`child stdout:\n${data}`);
});
child.stderr.on('data', (data) => {
console.error(`child stderr:\n${data}`);
});
fork()
사용법: `child_process.fork(modulePath, [args], [options])`
목적: `spawn()`의 특별한 경우로, `Node.js` 프로세스를 생성하는 데 사용됩니다.
데이터 처리: 부모 프로세스와 자식 프로세스 간의 통신 채널을 생성하여 메시지를 주고받을 수 있습니다.
const { fork } = require('child_process');
const forked = fork('child.js');
forked.on('message', (msg) => {
console.log('Message from child', msg);
});
forked.send({ hello: 'world' });
exec()
사용법: `child_process.exec(command, [options], callback)`
목적: 상대적으로 작은 양의 데이터를 반환하는 짧은 프로세스에 이상적입니다. 쉘 구문을 허용하며 쉘 내에서 명령을 실행합니다.
데이터 처리: 출력을 버퍼링하고 콜백 함수에 전달합니다.
반환 타입: `stdout`과 `stderr`를 받는 콜백에 출력을 버퍼링합니다.
const { exec } = require('child_process');
exec('find . -type f | wc -l', (err, stdout, stderr) => {
if (err) {
console.error(`exec error: ${err}`);
return;
}
console.log(`Number of files ${stdout}`);
});
execFile()
사용법: `child_process.execFile(file, [args], [options], callback)`
목적: `exec()`와 유사하지만 기본적으로 쉘을 생성하지 않습니다. 파일을 직접 실행하는 데 더 효율적입니다.
데이터 처리: 출력을 버퍼링하고 콜백 함수에 전달합니다.
반환 타입: `stdout`과 `stderr`를 받는 콜백에 출력을 버퍼링합니다.
동기 함수
예시: `spawnSync()`, `execSync()`, `execFileSync()`
사용법: 비동기 버전과 유사하지만 Node.js 이벤트 루프를 차단합니다.
목적: 비동기 코드 실행이 필수적이지 않거나 원하지 않는 시나리오에 적합합니다.
데이터 처리: 출력을 직접 반환합니다.
반환 타입: `stdout`, `stderr` 및 기타 정보를 포함하는 객체를 반환합니다.
이러한 함수들은 각각 다른 목적을 가지고 있으며, 실시간 데이터의 필요성, 데이터의 양, 쉘 명령의 사용 등 특정 작업의 요구 사항에 따라 선택됩니다. 일반적으로 Node.js 환경에서는 이벤트 루프의 비차단 특성을 유지하기 위해 비동기 함수(`spawn()`, `fork()`, `exec()`, `execFile()`)가 선호됩니다.
'Backend > Node.js' 카테고리의 다른 글
Node.js Event Architecture (0) | 2023.12.14 |
---|---|
Node.JS) Module Caching 을 알아보자 (0) | 2023.09.14 |
Node.js TDD 단위테스트, 통합테스트 (0) | 2023.07.14 |
Node.js 작동방식 및 Event loop (0) | 2023.06.26 |
Node.js (0) | 2023.06.26 |