티스토리 뷰
이번에 프로젝트를 하면서 백엔드 서버를 jar 파일로 gcp의 Ubuntu에 배포했었다.
그동안은 gcp 인스턴스를 종료할 일이 없어서 백엔드 서버를 수동으로 배포하고 실행을 시켰었는데, 이제 실제 서비스할 날이 다가오고 과부화 테스트를 진행하면서 인스턴스가 종종 꺼질 일이 생겼다.
그러다보니 점점 수동으로 실행시키기 귀찮아지도 실제 서비스 되었을 때 서버가 갑자기 셧다운 되는 등 예상하지 못한 일이 생길 수도 있으니 최대한 서버를 빨리 복구하고 실행을 시켜야겠다는 생각이 들었다.
그래서 jar 파일을 수동으로 실행시키는 것이 아닌 해당 인스턴스 리눅스에 등록해 자동실행 되게 설정해야겠다는 생각이 들었다.
(자동 배포는 추후 Jenkins를 이용해서 할 예정이다.)
참고로 이 과정들은 root 계정으로 하거나 또는 su/sudo 명령어를 붙여서 진행해야 한다.
서비스 등록을 위한 설정 파일 작성하기
우선 자동실행되게 하기 위해서는 해당 jar 파일을 리눅스로 되어 있는 서버에 서비스 등록해야 한다.
이 서비스 등록은 우선 서비스 설정 파일을 만들어야 가능하다.
아래 명령어를 통해 서비스 등록 파일을 해당 위치에 작성해준다.
(vi가 아니라 vim이 설치 되어 있다면 vim을 사용해도 된다.)
vi /etc/systemd/system/${service name}.service
파일작성기에 아래 내용을 작성한다.
[Unit]
Description=Service Description
After=syslog.target network.target postgresql.service
[Service]
ExecStart=/bin/bash -c "exec java -jar /usr/local/server/test.jar"
Restart=on-failure
RestartSec=10
User=root
Group=root
[Install]
WantedBy=multi-user.target
1. [Unit]
1.1 Description
Description=Service Description
이건 말 그대로 해당 서비스에 대한 설명이다. 추후 서비스를 실행하고 서비스의 status를 확인했을 때 표시되는 등 해당 서비스가 어떤 서비스인지에 대해 설명을 작성하면 된다.
1.2 After
After=syslog.target network.target postgresql.service
서비스가 언제 실행될지에 대해 정할 수 있는 부분이다. 서비스가 실행되기 전에 먼저 설정되어야하는 것들이나 실행되어야 하는 것들이 있을 경우 설정한다.
- syslog.target: 시스템 로그 관련된 것이 잘 설정된 후를 의미한다.
- network.target: 네트워크가 연결된 후를 의미한다.
- postgresql.service: 이 부분은 커스텀으로 넣은 부분으로 백엔드 서버가 postgresql DB와 연결해서 사용하는지라 postgresql 서비스가 시작된 후를 위해서 넣어봤다.
2. [Service]
2.1 ExecStart
ExecStart=/bin/bash -c "exec java -jar /usr/local/server/test.jar"
이 부분이 바로 jar 파일을 실행시키는 부분이다. '/bin/bash -c'를 입력하고 "exec "(쌍따옴표) 뒤에 해당 jar 파일을 실행시키는 명령어를 입력하면 된다. 참고로 현재까지 jar 파일을 수동으로 실행시킬 때는 백그라운드에서 실행시키기 위해서 nohup과 &를 사용했었는데 여기서는 그럴 필요 없이 그냥 입력해주면 된다.
2.2 Restart
Restart=on-failure
서비스가 언제 다시 시작할지에 대한 것을 설정할 수 있는 부분이다.
'on-failure'는 서비스를 실행시키는데 실패하면 다시 시작시키겠다는 의미의 설정이다.
그 밖에 'always'와 같은 다른 설정도 있다. 참고로 'always'의 경우는 서비스가 정상 종료되었다 해도 'on-failure'와 다르게 다시 시작하겠다는 뜻이다.
기본 값은 no로 서비스를 재시작하지 않겠다고 설정되어 있다.
2.3 RestartSec
RestartSec=10
서비스를 다시 시작하기 전에 몇 초동안 잠시 기다릴지에 대한 설정이다. 나는 10초로 조금 텀을 뒀지만 1초로 설정해놔도 무방하다.
기본 값은 100ms이다.
2.4 User, Group
User=root
Group=root
이건 해당 서비스를 실행하기 위한 권한이다.
3. [Install]
3.1 WantedBy
WantedBy=multi-user.target
서비스 run level을 설정하는 부분이다. 'multi-user.target'로 설정하면 다중 사용자로 설정된다.
작성한 서비스 설정파일로 서비스 등록하기
위의 설정파일을 작성 완료 한 후 ESC > wq를 입력하고 엔터를 치면 파일 작성이 완료된다.
그 후에 아래 명령을 치면 리눅스에서 서비스 파일들을 읽고 자동으로 새로 생긴 서비스의 경우 서비스 등록을 해준다.
daemon-reload
서비스 재시작
위 'daemon-reload' 명령어로 서비스를 등록해주고 서비스를 재시작해준다.
참고로 작성한 파일 명 그대로 '${서비스명}.service'으로도 명령어를 사용할 수 있고 '${서비스명}'으로도 명령어를 사용할 수 있다.
systemctl restart ${서비스명}
현재 구동되는 서비스들 목록 조회
서비스 등록을 정상적으로 등록됐다면 현재 서비스들의 리스트를 조회했을 때 해당 리스트에서 등록한 서비스를 확인할 수 있다.
아래 명령을 쳐서 서비스 리스트를 확인할 수 있으며 서버가 재부팅 되었을 때 서비스가 자동으로 시작되는지의 여부도 확인할 수 있다.
systemctl -t service list-unit-files
위 명령어나 위의 리스트에서 나온 것들에 대해서는 다 공부하지는 못했지만 STATE 부분이 enabled 되어 있을 경우 서비스가 서버 리부팅시 재시작 된다.
만일 등록한 서비스가 disabled로 설정되어 있다면 아래 명령어를 통해 enabled로 설정해주면 된다.
systemctl enable ${서비스명}
서비스 명령어(+ 상태 확인하기)
등록된 서비스는 아래 명령어로 다룰 수 있다.
1. 서비스 시작
systemctl start ${서비스명}
2. 서비스 재시작
systemctl restart ${서비스명}
3. 서비스 종료
systemctl stop ${서비스명}
4. 서비스 상태 확인하기
systemctl status ${서비스명}
'systemctl status ${서비스명}'을 치면 아래와 같이 해당 서비스 상태를 확인할 수 있다.
서비스 설정 파일에 지정해놓은 Description도 볼 수 있고 해당 서비스가 제대로 돌아가고 있는지도 확인할 수 있다. 이를 통해 내가 서비스 설정 파일을 잘 등록했는지도 확인할 수 있고, 서비스에 다른 문제가 없는지 확인할 수 있다.
✋ 서비스 설정 파일의 다른 여러 가지 옵션들은 아래 링크에서 확인할 수 있다!
https://www.freedesktop.org/software/systemd/man/systemd.service.html
- Total
- Today
- Yesterday
- 메시지큐
- eclipse
- DATABASE
- Java
- Intellij
- PostgreSQL
- 캐시
- 역직렬화
- 이클립스
- 캐싱
- mockito
- DB
- MAC
- Spring
- postgres
- Caching
- HttpClient
- springboot
- 데이터베이스
- 어노테이션
- rabbitmq
- cache
- 자바
- enum
- 공간데이터
- 스프링부트
- k8s
- JPA
- annotation
- ssh
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |