OS/Linux

[Linux] nohup을 대신할 systemd(systemctl) 사용법

fladi 2023. 8. 6. 01:18
728x90

 

이전에 사용한 방법: nohup

원래 jar파일을 배포할 때 nohup이라는 명령어를 자주 썼다. nohup 명령어의 동작 방식은 다음과 같았다.

nohup java -jar springProject.jar &

ps -ef

kill -9 [pid]
  1. nohup 으로 jar파일을 백그라운드로 실행시킨다
  2. 만들어진 프로세스를 확인한다
  3. 만들어진 nohup.out 파일로 로그를 확인한다
  4. 해당 프로세스를 ps 명령어로 조회한 후 kill해서 종료시킨다

 

 

문제점

  • 깃허브 액션으로 배포자동화를 하여 스크립트를 실행하려고 했는데, 이전 방법에서 ps -ef로 해당 pwd를 찾아 프로세스를 삭제하기 너무 어렵다고 생각하였다.
  • nohup을 대신할 방법이 systemctl 명령어라고 하여 방법을 찾아봤다

 

 

Systemd(System daemon)와 Systemctl

  • 전통적으로 Unix 시스템에 부팅후에 가장 먼저 생성된 후 다른 프로세스를 실행하는 init 역할을 대체하는 데몬
  • RedHat에 근무하는 Lennart Poettering이 주도적으로 개발을 시작, 지금은 RHEL/CentOs 와 Ubuntu나 Arch 등 대부분 리눅스 시스템에 공식적으로 채택됨
  • Systemctl 은 Systemd Utility 중 하나이며, 사용법을 익히면 사용이 가능함

 

출처:  https://en.wikipedia.org/wiki/Systemd#/media/File:Systemd_components.svg

 

 

사용법

 

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

 

systemd(system daemon) 을 관리하는 systemctl 명령어 사용법

 

www.lesstif.com

https://velog.io/@sileeee/Springboot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%ED%8F%AC-%EB%B0%8F-systemd%EC%84%A4%EC%A0%95

 

systemd설정 및 배포

프로세스를 실행한 터미널의 세션 연결이 끊어져도 지속적으로 동작하도록 systemd를 사용하여 설정해보았습니다.

velog.io

https://jjeongil.tistory.com/1629

 

Linux : Less 명령어, 사용 방법, 예제

Less는 파일 또는 명령 출력의 내용을 한 번에 한 페이지씩 표시하는 명령줄 유틸리티입니다. more와 비슷하지만 고급 기능이 있어 파일을 앞뒤로 탐색할 수 있습니다. 적게 시작할 경우 전체 파일

jjeongil.tistory.com

 

 

728x90