PM2는 다양한 인터페이스와 메서드를 제공하여 프로세스를 관리할 수 있도록 해준다. 주요 인터페이스와 메서드에 대해 살펴보자.

connect(callback)

PM2 데몬에 연결한다.

1
2
3
4
5
6
7
pm2.connect((err) => {
if (err) {
console.error(err);
process.exit(2);
}
// 연결 후 다른 PM2 명령 실행
});

start(options, callback)

새 프로세스를 시작한다.
옵션: 스크립트 경로, 이름, 인자, 환경 변수 등

1
2
3
4
5
6
7
8
9
10
11
pm2.start(
{
script: "app.js",
name: "my-app",
args: "arg1 arg2",
env: { NODE_ENV: "production" },
},
(err, apps) => {
if (err) console.error(err);
}
);

stop(process, callback)

실행 중인 프로세스를 중지한다.

1
2
3
pm2.stop("my-app", (err) => {
if (err) console.error(err);
});

restart(process, callback)

프로세스를 재시작한다.

1
2
3
pm2.restart("my-app", (err) => {
if (err) console.error(err);
});

delete(process, callback)

프로세스를 중지하고 PM2의 관리 목록에서 제거한다.

1
2
3
pm2.delete("my-app", (err) => {
if (err) console.error(err);
});

list(callback)

현재 PM2로 관리되는 모든 프로세스 목록을 반환한다.

1
2
3
pm2.list((err, list) => {
console.log(list);
});

describe(process, callback)

특정 프로세스에 대한 상세 정보를 반환한다.

1
2
3
pm2.describe("my-app", (err, description) => {
console.log(description);
});

monit()

실행 중인 프로세스의 모니터링 인터페이스를 시작한다.

주로 CLI에서 사용되며, 프로그래밍 방식으로는 잘 사용되지 않는다.

disconnect()

PM2 데몬과의 연결을 종료한다.

1
pm2.disconnect();

sendDataToProcessId(packet, callback)

실행 중인 프로세스에 메시지를 보낸다.

1
2
3
4
5
6
7
8
9
10
11
pm2.sendDataToProcessId(
{
type: "process:msg",
data: { some: "data" },
id: processId,
topic: "some topic",
},
(err, result) => {
// ...
}
);

pm2.sendDataToProcessId 함수를 사용해 데이터를 전송받은 프로세스에서 데이터를 수신하고 응답하기 위해서는 다음과 같이 하면 된다.

데이터 수신

프로세스는 ‘message’ 이벤트를 리스닝 하여 데이터를 수신할 수 있다.

1
2
3
4
process.on("message", (packet) => {
console.log("Received data:", packet);
// 수신한 데이터 처리 로직
});

응답 전송

프로세스는 process.send() 메서드를 사용하여 응답을 다시 보낼 수 있다.

1
2
3
4
5
6
7
process.send({
type: "process:msg",
data: {
success: true,
message: "작업이 완료되었습니다.",
},
});

한 가지 주의할 점은 이러한 IPC 메시지는 JSON으로 직렬화 가능한 데이터만 전송할 수 있다. 함수나 순환 참조가 있는 객체 등은 전송할 수 없다. 순환 참조가 있는 객체를 JSON으로 직렬화하려고 하면 대부분의 경우 오류가 발생한다. 이는 JSON.stringify() 함수가 무한 루프에 빠지지 않도록 설계되어 있기 때문이다.

launchBus(callback)

PM2 이벤트 버스를 시작한다. 이를 통해 프로세스의 로그와 기타 이벤트를 실시간으로 받을 수 있다.

1
2
3
4
5
pm2.launchBus((err, bus) => {
bus.on("log:out", (packet) => {
console.log(packet.data);
});
});

인터페이스들을 조합하여 PM2로 관리되는 프로세스의 전체 라이프 사이클을 프로그래밍 방식으로 제어할 수 있다. 각 메서드는 비동기적으로 작동하며, 대부분 콜백 함수를 통해 결과나 오류를 반환한다.

PM2를 사용할 때는 먼저 connect()를 호출하여 PM2 데몬에 연결하고, 작업이 끝나면 disconnect()를 호출하여 연결을 종료해야 한다. 이렇게 하면 리소스 관리를 안전하게 할 수 있다.