Node.js child_process

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