본문 바로가기

Programming/Node.js

4. Node 기능 살펴보기 (4) - 노드 내장 모듈 10 [child_process]

node js logo image

 

 

 

 

child_process는 모듈 이름에서 유추할 수 있듯이, 현재 노드가 실행되는 프로세스 이외에 새로운 프로세스를 띄워 명령 수행 및 결과를 드 프로세스에 전달합니다. 결국 이를 통해 노드에서 다른 프로그램이나 명령어를 실행할 수 있게 됩니다. 즉, 다른 언어의 코드도 실행하고 결괏값을 받을 수 있죠.

 

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

// 대상 명령어 전달('dir')
const process = exec('dir');

process.stdout.on('data', function(data){
    console.log(data.toString());
});

process.stderr.on('data', function(data){
    console.error(data.toString());
});

// 실행 전 콘솔에서 $chcp 65001 실행 -> utf8 변경

/* 출력
 Volume in drive x is 새 볼륨     
 Volume Serial Number is 


 Directory of x:\xx\Javascript

2024-03-26  오후 09:48    <DIR>          .
2024-03-26  오후 09:48    <DIR>          ..


2024-04-19  오전 01:55               431 example.mjs 

2024-03-13  오후 09:45    <DIR>          새 폴더     
               5 File(s)          1,072 bytes        
               3 Dir(s)  635,421,601,792 bytes free  
*/

 

 

우선 require().exec를 이용해 'child_process' 모듈을 로드합니다. 그리고 exec의 첫 번째 인수로 실행하고자 하는 명령어 dir을 전달했습니다. 

 

구조적으로 설명하자면, dir을 실행해서 나오는 결괏값은 stdout(표준 출력) / stderr(표준 에러)에 붙여둔 data 이벤트 리스너에 버퍼 형태로 전달됩니다. 일단 버퍼에 대해서도 추후 살펴볼 예정이니, 해당 명령어 별도 프로세스 상 실행 결과가 전달되는 방식에 대해서만 먼저 이해하도록 하겠습니다. 

 

 

 


 

 

이번에는 파이썬 프로그램을 별도로 실행하는 예제를 작성해 보겠습니다. 당연히 파이썬이 설치되어 있어야 합니다. 

 

[test.py]

print('python test!')

 

const spawn = require('child_process').spawn;

const process = spawn('python', ['test.py']);

process.stdout.on('data', function(data){
    console.log(data.toString());
});

process.stderr.on('data', function(data){
    console.error(data.toString());
});


/* 출력
python test!
*/

 

 

 


 

 

 

위에서 은근 슬쩍 execspawn의 차이를 설명하지 않았습니다. 일단 exec는 셸을 실행해서 명령어를 수행하고, spawn은 새로운 프로세스를 띄우며 명령어를 실행합니다. 물론 spawn에서도 세 번째 인수로 { shell: true }를 써서 exec처럼 셸을 실행하게 됩니다. 셸 실행 여부에 따라 수행할 수 있는 명령어에 차이가 발생하니, 참고하시기 바랍니다.