본문 바로가기

리눅스 인프라/Ubuntu

터미널이 종료해도 동작하는 스프링 서비스 만들기(PM2, Linux service)

관련 내용

[리눅스 인프라] - 스프링 부트 무중단 배포를 위한 NginX 적용하기

개요와 목적

리눅스 터미널에서 실행한, Spring 서버는 터미널이 종료되는 즉시 서버도 함께 종료된다. 이번 글에서는 PM2와 Linux service를 사용해서 터미널이 종료되어 동작하는 스프링 서버를 만들어보자.

위 관련 내용 글에서도 PM2를 사용해서, 터미널에 구애 받지 않고, API서버와 UI서버를 동시에 실행하였다.

개발 환경

  • SpringBoot(gradle) : 2.7.8
  • Ubuntu : 20.04

PM2

PM2는 Node.js 의 프로세스를 관리해주는 서비스이다. 이번 글에서는, Ubuntu에 PM2를 설치하고, 두 개의 스프링 서버를 올려서, 프로세스를 작동 시키는 방법에 대해서 알아보겠다.

설치

//NodeJs 설치
curl -o- <https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh> | bash
//nvm을 활성화
. ~/.nvm/nvm.sh
//Node.js의 최신 버전을 설치
nvm install --lts
//확인
node --version

//PM2 설치
npm install -g pm2

스프링 서버 작동하기

vi ui.json 파일을 만들어서, Spring 서버를 PM2에서 작동하기

{
  "apps" : [{
    "name"   : "uiserver",
    "script" : "java",
    "args"   : [
    	"-jar", 
			"-Dspring.profiles.active=server",
      "/home/j/SepearateDeliveryService/UIDeliveryService/build/libs/UIDeliveryService-0.0.1-SNAPSHOT.jar"
    ]
  }]
}

실행 하기

pm2 start ui.js

그리고 API 스프링 서버를 동작하게 하는 api.json 파일을 만들어 pm2 start api.json 하면,

아래 그림과 같이 하나의 우분투 서버에서 PM2를 사용해 스프링 API 서버와 UI 서버를 작동 시킬 수 있다.

Linux Service

이번에는 PM2가 아닌, .service 파일을 만들어 터미널이 종료되어 실행하는 스프링 서비스 만드는 방법에 대해서 알아보자.

Linux service는 사용자가 직접적으로 제어하지 않고, 백그라운드에서 작동하는 프로그램이다. service들은 systemd라는 프로세스가 관리한다.

service 파일 생성

sudo vi /etc/systemd/system/ui.service

해당 디렉토리에 서비스 파일을 만든다.

[Unit]
Description=Service Description
After=syslog.target network.target mysql.service

[Service]
ExecStart=/bin/bash -c "exec java -jar -Dspring.profiles.active=server /home/j/SepearateDeliveryService/UIDeliveryService/build/libs/UIDeliveryService-0.0.1-SNAPSHOT.jar"
Restart=on-failure
RestartSec=1

User=root
Group=root

[Install]
WantedBy=multi-user.target

권한 주고 실행 하기.

sudo systemctl daemon-reload

sudo systemctl enable ui.service

sudo systemctl start ui.service

상태 확인 및 종료

sudo systemctl status ui.service

sudo systemctl stop ui.service

systemd 명령어 


Reference

pm2

https://charlie-choi.tistory.com/240

https://zlcjfalsvk.github.io/java/pm2/

https://engineering.linecorp.com/ko/blog/pm2-nodejs/

https://velog.io/@ko-inseoklee/EC2에서-Spring-Boot-PM2로-배포하기

LinuxService

https://pamyferret.tistory.com/16

https://it-serial.tistory.com/entry/Linux-systemctl-명령어-프로세스-상태-확인

https://hello-gg.tistory.com/55