카테고리 없음

Node.js에서 js script실행하기

개발하는 가오나시 2023. 11. 30. 17:01

우리는 단일 js파일을 노드 환경에서는 'node ~.js' 이런 식으로 실행 할 수 있다. 그렇다면 돌아가고 있는 서버 안에서는 어떻게 이런 스크립트를 실행시켜야할까.

 

const exec = require('child_process').exec;
const execSync = util.promisify(require('child_process').exec);

 

exec는 Node.js에서 다른 프로세스의 명령을 실행할 때 사용한다. 또한 exec함수는 shell을 사용하기 때문에 편하게 사용할 수 있다. 하지만 exec함수는 콜백함수를 받아서 동작하기에 async await같은 프로미스를 이용하는 구문에서는 처리가 귀찮을 수 있다. 이럴 때 execSync 처럼 프로미스를 리턴하도록 만들어 줄 수 있다.

 

간단히 폴더를 tar 파일로 압축하여 s3에 올리는 스크립트이다. 이 스크립트는 노드 서버안에 있으며, 노드 프로젝트에서 "aws-adk" 라이브러리를 설치한 상태이다. 

const fs = require('fs');
const util = require('util');
const AWS = require('aws-sdk');
require('dotenv').config();
const execSync = util.promisify(require('child_process').exec);

const s3 = new AWS.S3({
  accessKeyId: process.env.IB_S3_KEYID,
  secretAccessKey: process.env.IB_S3_KEY,
  region: 지역,
});

const target = process.argv[2];
const date = process.argv[3];

const tarFileName = `${date}.tar`;

async function db_backup() {
  try {
    await execSync(`sudo tar -cvf ${tarFileName} ${mongodb의 볼륨경로}`);

    await s3
      .upload({
        Bucket: process.env.IB_S3_BUCKET,
        Key: `${target}/${tarFileName}`,
        ACL: 버킷 접근 권한,
        Body: fs.createReadStream(tarFileName),
        ContentType: 'application/x-tar',
      })
      .promise();

    await execSync(`rm -rf ${tarFileName}`);
  } catch (err) {
    console.log(err);
  }
}

event_backup();

 

"require('dotenv').config"는 프로젝트 루트 경로의 .env를 읽어서 process.env를 통해 환경변수에 접근할 수 있게 해준다. 이 스크립트를 실제 실행하게 될 때에

exec(`node script/event_backup.js ${eid} ${getDate()}`)

 

이렇게 실행하게 되는데, 이때 전달되는 props는 process.argv 배열에 들어오게 되고, 그 순서는 다음과 같다.

exec    / (`node script/event_backup.js / ${eid}  / ${getDate()}`
argv[0] / argv[1]                       / argv[2] / argv[3]

 

이렇게 전달받은 파라미터로 스크립트를 실행하게 된다.