본문 바로가기
기타

백그라운드에서 자바(Java) 어플리케이션 실행하기: nohup 명령어(start.sh)와 로그백(logback) 활용

by 플라퉁 2023. 11. 4.
728x90
반응형

 

 

 

안녕하세요 오늘은 자바 어플리케이션을 배포하기 위해  start.sh 을 사용하고 로그도 확인해 보겠습니다.

 

 

 

1. start.sh 만들기

 

리눅스에서 vi start.sh 명령어를 사용하여 start.sh을 만들어 봅시다.

 

해당 sh에 실행권한을 부여합니다.

 

명령어는 chmod +x start.sh 입니다.

 

이제 start.sh 을 작성해봅시다.

 

 

 

 

2. nohub 명령어 사용

 

nohub 이란 (no hang up) 즉 행업이 없이 계속 실행하겠다 라는 의미 입니다.

 

즉시 예제를 보며 설명하겠습니다.

 

#!/bin/bash
nohup /app/jdk/open-jdk-11.0.2/bin/java -DTESTAPP -server -Xms4g -Xmx4g -jar ../lib/test-app-0.1.0.jar --spring.config.location=file:../conf/application.yml >> ../logs/TESTAPP.log &

 

 

"#!/bin/bash"는 스크립트 파일의 첫 줄에 위치하는 특별한 주석입니다. 

 

이 주석은 스크립트 파일을 실행할 때 사용할 인터프리터(해석기)를 지정하는 역할을 합니다.

해당 주석은 "해시뱅"이라고도 불리며, 스크립트 파일이 Bash(Bourne Again SHell) 인터프리터에서 실행되어야 함을 나타냅니다. 

 

Bash는 대표적인 Unix/Linux 환경에서 사용되는 명령어 해석기로, 

 

쉘 스크립트를 실행하는 데 사용됩니다. 

 

이 주석을 통해 운영체제가 스크립트 파일을 올바른 방식으로 해석할 수 있도록 도와줍니다.

따라서, "#!/bin/bash" 주석은 스크립트 파일이 Bash 인터프리터에서 실행되어야 함을 나타내는 것입니다. 

 

이 주석을 스크립트 파일의 첫 줄에 추가함으로써 스크립트를 정상적으로 실행할 수 있습니다.

 

또한 마지막에 & 도 꼭 적어야 합니다. 이는 백그라운드에서 실행하겠다는 의미로 nohub 과 세트입니당!

 

꼭 적어 주셔야 되요!

 

 

 

3. java 어플리케이션 실행

 

nohub 다음에는 자바 버전이 나오죠?? 사용하려는 버전의 자바 경로를 적어주세요

 

다음은 사용할 프로세스 이름입니다. 저는 TESTAPP이라고 네이밍 하였습니다.

 

그리고 자바 메모리를 설정합니다. 

 

-Xms:
"-Xms" 옵션은 JVM이 시작될 때 할당되는 초기 힙 메모리 크기를 지정합니다.
예를 들어, "-Xms512m"은 JVM이 시작될 때 512MB의 힙 메모리를 할당하도록 설정합니다.
초기 힙 크기는 JVM이 실행되는 동안 사용되는 최소 메모리 양을 나타내며, JVM이 시작될 때 해당 크기의 메모리가 미리 할당됩니다.

 

-Xmx:
"-Xmx" 옵션은 JVM이 사용할 수 있는 최대 힙 메모리 크기를 지정합니다.
예를 들어, "-Xmx2g"는 JVM이 사용할 수 있는 최대 2GB의 힙 메모리를 지정합니다.
최대 힙 크기는 JVM이 사용할 수 있는 힙 메모리의 상한을 나타내며, 이 크기를 초과하는 메모리 요청은 OutOfMemoryError를 발생시킵니다.

 

마지막으로 실행될 jar와 외부 설정 파일을 지정하였습니다.

 

-jar ../lib/test-app-0.1.0.jar --spring.config.location=file:../conf/application.yml

 

자 이렇게 설정하고 ./start.sh 명령어를 사용해 보세요!

 

여러분의 어플리케이션이 백그라운드에서 실행되고

 

logs 폴더에서 log를 확인 할 수 있습니다. 또한 ps -ef 를 통해 process를 확인해보세요!!

 

 

 

4. 업그레이드된 로그관리

 

#!/bin/bash
nohup /app/jdk/open-jdk-11.0.2/bin/java -DTESTAPP -server -Xms4g -Xmx4g -jar ../lib/test-app-0.1.0.jar --spring.config.location=file:../conf/application.yml >/dev/null 2>&1 &

 

 

자 이번에는 로그쪽 명령어가 수정되었죠??

 

"/dev/null"과 "2>&1"은 리눅스나 유닉스 시스템에서 명령어 실행 시 출력을 관리하는 데 사용되는 특수한 옵션입니다.

"/dev/null":
"/dev/null"은 Null 장치라고도 불리는 가상의 디바이스 파일입니다.
이 파일은 모든 데이터를 버릴 수 있는 특성을 가지고 있습니다.
명령어나 프로세스의 출력을 "/dev/null"로 리다이렉트하면 출력이 폐기되므로 아무런 결과를 터미널에 표시하지 않습니다.
주로 불필요한 출력을 무시하거나 출력이 필요하지 않은 경우에 사용됩니다.

 

"2>&1":
"2>&1"은 표준 에러 출력(STDERR)을 표준 출력(STDOUT)으로 리다이렉트하는 역할을 합니다.
명령어 실행 시 발생하는 오류 메시지나 에러 출력을 표준 출력으로 병합하여 함께 처리하도록 합니다.
일반적으로 터미널에서 명령어를 실행하면 표준 출력과 표준 에러 출력이 별도로 처리되지만, "2>&1"을 사용하면 표준 에러 출력을 표준 출력과 동일한 채널로 리다이렉트하여 함께 처리할 수 있습니다.
이를 통해 표준 출력과 표준 에러 출력이 동일한 목적지로 전달되어 효율적인 출력 관리가 가능해집니다.
따라서, "/dev/null"은 출력을 폐기하는 가상의 장치 파일로 사용되며, "2>&1"은 표준 에러 출력을 표준 출력과 병합하여 함께 처리하는 역할을 합니다. 이를 통해 사용자는 필요한 경우 출력을 무시하거나 효율적으로 관리할 수 있습니다.

 

그냥 리눅스에서 따로 로그 안찍겠다 이말입니다.

 

이제 어플리케이션을 jar로 말때 로그백을 쓰면 커스텀된 로그관리를 할 수 있습니다.

 

다음은 로그백 설정 파일입니다. 이 파일은 리소스에 위치합니다.

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <property name="LOG_FILE_PREFIX" value="../logs/TESTAPP" />

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p}\(${PID:- }\)[%t] [%logger{30}:%line] %msg%n</pattern>-->
            <pattern>{"level":"%level","time":"%d{yyyy-MM-dd HH:mm:ss.SSS}","thread":"%thread","msg":"%msg"}%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <charset>UTF-8</charset>
<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p}\(${PID:- }\)[%t] [%logger{30}:%line] %msg%n</pattern>-->
            <pattern>{"level":"%level","time":"%d{yyyy-MM-dd HH:mm:ss.SSS}","thread":"%thread","msg":"%msg"}%n</pattern>
        </encoder>
        <file>${LOG_FILE_PREFIX}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_PREFIX}_%d{yyyyMMdd}.log</fileNamePattern>
            <maxHistory>3</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="WARN">
        <appender-ref ref="CONSOLE"/>
    </root>

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

 

 

이제 커스텀된 로그를 확인하실 수 있을겁니다!

 

로그백에 대한 세부 설정은 방대하므로

 

다음 기회에 로그백편을 따로 제작해서

 

더욱 자세히 알아보겠습니다.

 

이번 편을 통해 서버에 자바를 실행하고 운영해 보세요!!

 

감사합니다!!!

 

 

 

 

 

728x90
반응형

댓글