JUINTINATION
EC2 프로젝트 nohup으로 백그라운드로 실행해보기 본문
이 글은 지난 EC2 타임존 변경 및 종료 스크립트 작성에서 이어지는 내용이다. 참고한 책과 순서가 조금 다를 수 있다.
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 명령어를 이용하여 프로젝트를 백그라운드로 실행하는 방법과 각종 로그 관련 기능들에 대해 알아보았다. 지난 글과 마찬가지로 그리 어려운 내용은 아니었던 것 같은데 책을 읽지 않았더라면 관심도 안 가졌을 것 같은 느낌이 든다. 앞으로도 내 생각에만 의존하지 않고 책을 많이 읽으면서 견문을 넓혀가야 겠다는 생각이 들었다.
'Amazon Web Services' 카테고리의 다른 글
EC2 배포 파일 압축 및 파일 전송하기 (0) | 2024.07.11 |
---|---|
EC2 재배포 프로세스와 배포 자동화 스크립트 (0) | 2024.07.11 |
EC2 프로젝트 cron 주기적 실행 (0) | 2024.07.10 |
EC2 서버 타임존 변경 및 종료 스크립트 작성 (0) | 2024.07.09 |
Amazon EC2 시작하기 (7) | 2024.07.09 |