JUINTINATION

EC2 프로젝트 nohup으로 백그라운드로 실행해보기 본문

Amazon Web Services

EC2 프로젝트 nohup으로 백그라운드로 실행해보기

DEOKJAE KWON 2024. 7. 10. 15:45
반응형

이 글은 지난 EC2 타임존 변경 및 종료 스크립트 작성에서 이어지는 내용이다. 참고한 책과 순서가 조금 다를 수 있다.

 

EC2 서버 타임존 변경 및 종료 스크립트 작성

이 글은 지난 Amazon EC2 시작하기에서 이어지는 내용이며, 지난번에 설명하지 않고 넘어간 mobaXterm 설정부터 시작하려고 한다. Amazon EC2 시작하기드디어 미루고 미루던.. 배포에 도전해보려고 한다

juintination.tistory.com

nohup

nohup은 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작할 수 있게 해주는 명령어이다.

먼저 평소처럼 $ java -jar \*.jar 명령어로 nohup을 사용하지 않고 실행한 뒤 터미널 창을 종료하고 서버에 접속이 가능한지 확인해보면 접속이 불가능한 것을 확인할 수 있다.

 

위와 같이 $ nohup java -jar \*.jar & 명령어로 터미널 창을 종료한 뒤 다시 브라우저로 {인스턴스의 IPv4 주소}:8080/aws/v1 주소로 접속해보면 서버가 종료되지 않고 돌아가고 있는 것을 확인할 수 있으며, 다른 터미널 창에서 $ netstat -ntlp 명령어로 확인해봤을 때 8080 포트가 백그라운드에서 제대로 돌아가는 것 또한 확인할 수 있다.

 

지난번에 작성했던 spring-stop.sh 스크립트를 실행하여 프로젝트를 종료한 뒤 $ ls 명령어로 현재 디렉터리 내부를 확인해보면 nohup.out 파일이 새롭게 생성된 것을 확인할 수 있다. 그리고 $ vi nohup.out 명령어를 실행하여 내용을 확인해봤을 때 아래와 같이 스프링 프로젝트가 정상적으로 실행되는 로그가 저장된 것 또한 확인할 수 있다.

 

참고로 이 상태에서 아무런 동작 없이 ESC 를 누른 후에 :wq 가 아닌 :q 를 입력하고 엔터하면 저장하지 않고 그대로 나올 수 있다.

 

vi가 익숙하지 않다면 $ cat nohup.out 명령어로 바로 아래에서 읽을 수 있게 할 수도 있다.

 

확실하게 하기 위해 $ rm nohup.out 명령어로 기존의 nohup.out 파일을 삭제한 뒤에 다시 nohup으로 스프링 프로젝트를 실행한다. 이후에 $ tail -f nohup.out 명령어를 실행하면 위와 같이 로그들을 실시간으로 확인할 수 있다.

실시간으로 업데이트되는지 확인하기 위해 브라우저로 다음의 주소에 차례로 접속해보자.

 

  • {인스턴스의 IPv4 주소}:8080/aws/v1 혹은 {인스턴스의 IPv4 주소}:8080/aws/v1?number=1
  • {인스턴스의 IPv4 주소}:8080/aws/v1?number=-1
  • {인스턴스의 IPv4 주소}:8080/aws/v1?number=0

 

위와 같이 로그들이 실시간으로 추가되는 것을 볼 수 있다. 실시간으로 모니터링 중인 로그는 Ctrl + C 키로 종료가 가능하다. 위와 같이 로그들이 남는 이유은 코드의 컨트롤러 부분을 보면 알 수 있다.

 

package com.metacoding.v1.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class HelloController {

    @GetMapping("/aws/v1")
    public String hello(@RequestParam(defaultValue = "1") Integer number) {
        if (number == 1) { // info 로그
            log.info("/aws/v1 이 호출되었어요. info 로그 #####################################");
        } else if(number == -1) { // error 로그
            log.error("/aws/v1 이 호출되었어요. error 로그 #####################################");
        } else if(number == 0) { // warn 로그
            log.warn("/aws/v1 이 호출되었어요. warn 로그 #####################################");
        }

        return "<h1>aws v1</h1>";
    }
}

자바 스프링 관련 글이 아니기 때문에 자세한 설명은 생략하지만 딱 봐도 number의 값이 달라질 때마다 다른 로그가 출력될 것 같다는 느낌이 들 것이다.

 

추가적으로, 로그 파일이 nohup.out에 저장되는 것이 싫다면 아래처럼 다른 파일에 저장되게 할 수도 있다.

먼저 스프링 프로젝트를 종료한 뒤 $ nohup java -jar \*.jar >mylog.out & 명령어로 mylog.out에 로그가 출력되도록 한다. 더 자세하게 보자면 >mylog.out은 1>mylog.out에서 표준 출력을 의미하는 1이 생략된 것이다. 또한 꺽쇠(>)를 하나만 적으면 로그가 덮어쓰기가 되며, 두 개(>>)를 적어주면 그 밑에 추가가 되는 방식이다.

마찬가지로 $ cat mylog.out 명령어 또는 $ vi mylog.out 명령어를 통해 내용을 확인할 수 있으며 $ tail -f mylog.out 명령어를 통해 실시간 모니터링 또한 가능하다. 그렇다면 표준 출력과 에러 출력을 구분할 수 있을 것 같다는 생각이 들 것이다.

 

위와 같이 $ nohup java -jar \*.jar 1>log.out 2>err.out & 명령어를 실행하면 된다. 표준 출력(1)은 log.out에, 에러 출력(2)은 err.out에 출력을 리다이렉션한 것이다.

 

스프링 프로젝트는 정상적으로 실행됐기 때문에 $ vi err.out 명령어를 실행해서 err.out의 내용을 확인해보면 위와 같이 아무런 로그가 남아있지 않은 것을 확인할 수 있을 것이다.


결론

이번엔 nohup 명령어를 이용하여 프로젝트를 백그라운드로 실행하는 방법과 각종 로그 관련 기능들에 대해 알아보았다. 지난 글과 마찬가지로 그리 어려운 내용은 아니었던 것 같은데 책을 읽지 않았더라면 관심도 안 가졌을 것 같은 느낌이 든다. 앞으로도 내 생각에만 의존하지 않고 책을 많이 읽으면서 견문을 넓혀가야 겠다는 생각이 들었다.

728x90
Comments