티스토리 뷰

BackEnd/Java

pm2 java

철철22 2019. 9. 24. 21:47
반응형

안녕하십니까

 

혹시 pm2라는 도구를 아십니까? pm2는 Node js에서 사용하는 프로세스 관리 도구입니다.

pm2를 이용하여 Node.js의 프로세스를 시작, 중지 모니터링 등 다양한 관리를 할 수 있으며, 온라인에서도 관리할 수 있는 유용한 툴입니다.

 

특히 Node js는 서버에 오류가 생기면 죽는 경우가 자주 생기는데, 보통 이럴 때는 forever 나 pm2를 많이 사용하며, 

프로세스가 죽을 경우에 자동으로 재시작해주는 기능이 있고, 

 

싱글 스레드 기반 (이벤트 루프)인 Node js는 클러스터 모드라는 것이 있는데 pm2를 이용하여 간단하게 클러스터 모드를 구현할 수 있습니다.

 

pm2에 대해서는 다른 분들의 글을 참조하시면 되고, 이 글을 작성하는 이유인 java 또한 pm2를 이용해서 관리할 수 있다는 겁니다.

 

기존에 저는 java 프로그램이 있다면, gradle bootrun을 이용하여 바로 실행시키거나, jar로 빌드 후 linux상에서 java -jar 를 이용하여 실행을 해 왔으며 이 작업 또한 귀찮아서 쉘 스크립트를 작성하여 systemd(systemctl)에 등록하여 죽어도 다시 실행되게 했었습니다.

이런 식으로 java프로젝트를 만들 때마다 여간 귀찮은 작업이 있을 수밖에 없었는데 Node js를 개발하며 pm2라는 모듈을 알았을 때 java에도 적용을 할 수 없을까라는 생각을 하다가 여러 가지 자료를 찾으며 결국 구현을 해서 공유를 하기 위해 글을 작성합니다.

 

기존에는 이런 식으로 start.sh파일을 만들어서 실행을 시켰습니다. 외부 properties파일을 연결해 준다면 argument까지 줘야 해서 매우 긴 스크립트가 되죠.

#! /bin/bash

root_dir="/home/ubuntu/02_Server"

cd $root_dir/01_Main

gradle build

#nohup java -jar $root_dir/01_Main/build/libs/pabii-some-server-0.0.1.jar --spring.config.location=classpath:/default.properties,$root_dir/config/main.application.properties 1> /dev/null 2>&1 &

 

이렇게 실행시킨 후 프로세스를 죽여야 할 때 fuser -k {{port}}/tcp netstat -anp | grep LISTEN | grep :{{port}}
를 이용한 스크립트를 만들어서 죽이는 게 여간 귀찮은 작업이 아닐 수 없습니다.

 

 

이를 해결하기 위하여 java에 pm2 모듈을 적용해 봅니다.

우선 실습 환경에 Node JS와 PM2는 각자 설치 해주세요.

 

pm2를 이용하기 위해서는 start.json 파일을 만들어 줘야 합니다.  linux환경에 설치한다 생각하고 작성해보겠습니다.

 

start.json (gradle bootrun) 

{
    "apps": [{
      "name": "pm2Example",
      "cwd": ".",
      "args": [
        "bootrun"
      ],
      "env": {
      },
      "script": "/opt/gradle/gradle-5.1.1/bin/gradle",
      "node_args": [],
      "exec_interpreter": "none",
      "exec_file": "/dev/null",
      "exec_mode": "fork"
    }]
  }

start.json (jar 파일 실행하기 external properties까지)

{
    "apps": [{
      "name": "some",
      "cwd": ".",
      "args": [
        "-jar",
        "./01_Main/build/libs/server-0.0.1.jar",
        "--spring.config.location=classpath:/default.properties,./config/main.application.properties"
      ],
      "env": {
      },
      "script": "/usr/local/java/jdk1.8.0_221/bin/java",
      "node_args": [],
      "exec_interpreter": "none",
      "exec_file": "/dev/null",
      "exec_mode": "fork"
    }]
  }

 

이후 pm2 모듈로 실행 하기 위해서는 pm2 start start.json이라는 명령어를 사용하시면 되는데 저는 이 마저도 귀찮아서 그냥 스크립트를 만들었습니다. 

#! /bin/bash

root_dir="/home/ubuntu/02_Server"

cd $root_dir/01_Main

gradle build

cd $root_dir
pm2 start $root_dir/start.json

 

결과

위의 사진처럼 online이 나오면 성공입니다.

 

pm2 log App name

pm2 monit 

등등 여러 명령어도 잘 작동됩니다.

 

앞으로 저는 java 빌드 후 실행도 pm2를 이용하여 관리할 거 같습니다.

 

 

참고 및 출처

pm2

http://pm2.keymetrics.io/docs/usage/application-declaration/#environment-definition

 

https://javaexpert.tistory.com/957

 

Node js 클러스터

https://programmingsummaries.tistory.com/384

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함