728x90
이전에 사용한 방법: nohup
원래 jar파일을 배포할 때 nohup이라는 명령어를 자주 썼다. nohup 명령어의 동작 방식은 다음과 같았다.
nohup java -jar springProject.jar &
ps -ef
kill -9 [pid]
- nohup 으로 jar파일을 백그라운드로 실행시킨다
- 만들어진 프로세스를 확인한다
- 만들어진 nohup.out 파일로 로그를 확인한다
- 해당 프로세스를 ps 명령어로 조회한 후 kill해서 종료시킨다
문제점
- 깃허브 액션으로 배포자동화를 하여 스크립트를 실행하려고 했는데, 이전 방법에서 ps -ef로 해당 pwd를 찾아 프로세스를 삭제하기 너무 어렵다고 생각하였다.
- nohup을 대신할 방법이 systemctl 명령어라고 하여 방법을 찾아봤다
Systemd(System daemon)와 Systemctl
- 전통적으로 Unix 시스템에 부팅후에 가장 먼저 생성된 후 다른 프로세스를 실행하는 init 역할을 대체하는 데몬
- RedHat에 근무하는 Lennart Poettering이 주도적으로 개발을 시작, 지금은 RHEL/CentOs 와 Ubuntu나 Arch 등 대부분 리눅스 시스템에 공식적으로 채택됨
- Systemctl 은 Systemd Utility 중 하나이며, 사용법을 익히면 사용이 가능함
사용법
1. /etc/systemd/system/myapp.service 를 수정한다
sudo nano /etc/systemd/system/myapp.service
- nano라는 텍스트 편집기를 사용하였다
- 이 파일 안에 실행할 스크립트를 작성해준다
[Unit]
Description=My Spring Boot Application
After=syslog.target
[Service]
User=user1
ExecStart=/usr/bin/java -jar /user1/project/jarfile.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
- Description: 설명
- After: 해당 서비스 또는 환경이 조성된 후 실행
- User: 실행하는 user
- ExeStart: jar파일을 실행하는 명령어를 담는다
- (참고)java 환경변수를 등록했다고 해서 java -jar로 바로 쓰면 오류가 난다. 꼭 절대경로를 다 기입해야한다.
- SuccessExitStatus: 성공으로 판단할 시그널 지정
- WantedBy: muti-user.target은 다중 사용자 대상. 사용자가 일반적으로 여러 콘솔이나 네트워크를 통해 로그인 가능.
2. 서비스를 등록하기
# user daemon 리로딩
sudo systemctl daemon-reload
# 서비스 enable, system 부팅 시 service가 자동으로 시작되도록 함
sudo systemctl enable myapp.service
- user의 daemon을 리로딩한 후
- myapp.service를 enable 시켜준다. 시스템부팅 시 service가 자동 시작하도록 만들어주는 것이다
3. 서비스를 실행하기
# 서비스 시작하기
sudo systemctl start myapp.service
# 서비스 상태 확인
sudo systemctl status myapp.service
# 서비스 중지
sudo systemctl stop myapp.service
- 서비스를 시작한다
- 서비스의 상태를 status 명령어로 확인이 가능하다
- 실행이 잘 되었다면 다음과 같이 active(running)이 보이고, springboot 프로젝트에서 나오는 로그가 보인다
4. 로그보기: journalctl
journalctl -u myapp.service
# 최근 10개의 에러로그만 표시
journalctl -n 10 -u myapp.service
# 페이징해서 보기
journalctl -u myapp.service | less
# 페이징해서 보기2
journalctl -e
# 상세설명 추가해서 보기
journalctl -x
# 변경사항 계속 보기
journalctl -f
- journalctl 명령어로 로그를 확인할 수도 있다
- less명령어로 페이징 가능
- 위, 아래 화살표
- space, f: 한 페이지 뒤로 이동
- b: 한 페이지 뒤로 이동
- q: 끝내기
- 이 외에도 시간단위 필터링이 가능하고, 우선순위 필터링도 가능하다
5. 그 외의 명령어
sudo systemctl list-unit-files --state=enabled
- 현재 enabled 된 모든 서비스 확인
- 등록한 서비스와 mysql도 보인다
익숙해지면 nohup보다 systemctl을 자주 사용하게 될 것 같다. ps -ef로 찾지 않아도 되고, stop service만 하면 되니 스크립트 짜기도 훨씬 편한 것 같다ㅎㅎ
참고자료
https://www.lesstif.com/system-admin/systemd-system-daemon-systemctl-24445064.html
https://jjeongil.tistory.com/1629
728x90