seungjun.dev

Node.js 프로그램에서 터미널 명령어 실행하기

Node.js 프로그램에서 실제 터미널 명령 실행하기

child_process 모듈을 사용하면 현재 실행 중인 Node.js 프로세스 외에 새로운 프로세스를 생성하여 셸 명령어를 실행하거나 다른 프로그램을 실행할 수 있게 해준다.

exec()

셸 명령어를 실행하기 위해서는 exec() 함수를 사용하면 된다.

이 함수는 셸을 먼저 실행한 뒤, 그 셸에서 명령어를 실행한다. 명령어 실행이 완료되면 모든 결과를 버퍼에 담아 한 번에 콜백 함수로 전달한다.

const { exec } = require("child_process");

exec(command, [options], (error, stdout, stderr) => {
  // 콜백 함수 로직
});

options

options 객체를 통해 exec의 동작을 세밀하게 제어할 수 있다.

옵션설명
cwd자식 프로세스의 현재 작업 디렉토리를 지정
env자식 프로세스에 전달할 환경 변수를 키-값 쌍의 객체로 설정
shell명령어를 실행할 셸의 경로를 지정
maxBufferstdout 또는 stderr에 허용되는 최대 버퍼 크기를 바이트 단위로 지정

콜백함수

비동기적으로 명령어를 실행한 뒤, 실행이 완전히 종료되면 결과를 정리해 이 콜백함수를 호출한다.

(error, stdout, stderr) => {
  // ... 로직 ...
};
  1. error

error 객체는 명령어 실행 과정에서 오류가 발생했을 때 전달되는 값이다. 오류가 없다면 null이다.

  1. stdout

stdout은 명령어의 표준 출력(standard output) 결과를 담고 있는 문자열 또는 버퍼이다. 명령어가 성공적으로 실행되어 화면에 출력하는 모든 내용이 여기에 담긴다.

const { exec } = require("child_process");

// 현재 디렉토리의 파일 목록을 출력하는 'ls -l' 명령어
exec("ls -l", (error, stdout, stderr) => {
  if (error) {
    console.error(`error: ${error.message}`);
    return;
  }

  // stdout에는 'ls -l'의 결과(파일 목록)가 들어 있습니다.
  console.log(`표준 출력 결과:\n${stdout}`);
});
  1. stderr

stderr는 명령어의 표준 에러(standard error) 출력을 담고 있는 문자열 또는 버퍼이다. 주로 경고 메시지나 진행 상황 알림, 또는 실제 오류 메시지를 출력하는 데 사용된다.

중요한 점은 stderr에 값이 있다고 해서 반드시 명령어가 실패한 것은 아니라는 점이다. 일부 프로그램은 오류가 아닌 정보성 메시지(e.g. 진행률 표시)를 stderr로 출력하기도 한다.

따라서 명령어의 성공/실패 여부는 반드시 error 객체의 유무로 따져야한다.