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!
*/
위에서 은근 슬쩍 exec와 spawn의 차이를 설명하지 않았습니다. 일단 exec는 셸을 실행해서 명령어를 수행하고, spawn은 새로운 프로세스를 띄우며 명령어를 실행합니다. 물론 spawn에서도 세 번째 인수로 { shell: true }를 써서 exec처럼 셸을 실행하게 됩니다. 셸 실행 여부에 따라 수행할 수 있는 명령어에 차이가 발생하니, 참고하시기 바랍니다.
'Programming > Node.js' 카테고리의 다른 글
4. Node 기능 살펴보기 (5) - 파일 시스템 접근하기 [fs] 2 (0) | 2024.05.10 |
---|---|
4. Node 기능 살펴보기 (5) - 파일 시스템 접근하기 [fs] 1 (0) | 2024.05.08 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 9 [worker_threads] 4(★) (0) | 2024.05.02 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 9 [worker_threads] 3 (0) | 2024.05.02 |
4. Node 기능 살펴보기 (4) - 노드 내장 모듈 9 [worker_threads] 2 (0) | 2024.05.01 |