#!/bin/bash
#
# ┌──────────────────────────────────────────────────────────────┐
# │ [Linux] nohup 기반 자바 애플리케이션 실행 및 프로세스 관리 │
# │ - PID 파일로 기존 프로세스 종료 후 재실행 │
# └──────────────────────────────────────────────────────────────┘
#
# 사용 방법:
# 1. 이 스크립트를 서버에 복사합니다. (예: /usr/local/bin/run_app.sh)
# 2. 실행 권한을 부여합니다: chmod +x /usr/local/bin/run_app.sh
# 3. 애플리케이션을 실행/재실행할 때마다: ./run_app.sh
#
# 스크립트 동작 요약:
# - program.pid 파일이 있으면, 해당 PID를 읽어와 프로세스 존재 여부를 확인하고 종료(SIGTERM → SIGKILL).
# - nohup java -jar로 자바 애플리케이션을 백그라운드 실행.
# - 표준 출력 및 표준 에러를 program.log로 모두 기록(Append).
# - 새로 생성된 프로세스의 PID를 program.pid 파일에 기록.
#
# ───────────────────────────────────────────────────────────────────
# 1) 변수 설정: PID 파일, 로그 파일, JAR 파일 경로 (절대 경로 권장)
# ───────────────────────────────────────────────────────────────────
PID_FILE="/home/ubuntu/app/program.pid"
LOG_FILE="/home/ubuntu/app/program.log"
JAR_FILE="/home/ubuntu/app/program.jar"
# ───────────────────────────────────────────────────────────────────
# 2) 기존 프로세스 확인 및 종료
# ───────────────────────────────────────────────────────────────────
if [ -f "$PID_FILE" ]; then
OLD_PID=$(cat "$PID_FILE" 2>/dev/null)
if [ -n "$OLD_PID" ]; then
# 2-1) PID가 실제로 실행 중인지 확인
if ps -p "$OLD_PID" > /dev/null 2>&1; then
echo "[INFO] 기존 프로세스(PID: $OLD_PID)를 종료합니다..."
# 2-2) 우선 SIGTERM(SIG15)으로 정상 종료 시도
kill -15 "$OLD_PID"
# 2-3) 종료 대기 시간(예: 5초)
sleep 5
# 2-4) 여전히 프로세스가 살아 있으면 SIGKILL(SIG9)으로 강제 종료
if ps -p "$OLD_PID" > /dev/null 2>&1; then
echo "[WARN] SIGTERM으로 종료되지 않아 SIGKILL로 강제 종료합니다."
kill -9 "$OLD_PID"
fi
echo "[INFO] 프로세스 $OLD_PID 종료 완료."
else
echo "[WARN] PID 파일은 존재하나, 해당 PID($OLD_PID) 프로세스가 이미 종료되어 있습니다."
fi
fi
# 2-5) 이전 PID 파일 삭제
rm -f "$PID_FILE"
echo "[INFO] 이전 PID 파일을 삭제했습니다."
fi
# ───────────────────────────────────────────────────────────────────
# 3) 새로운 애플리케이션 백그라운드 실행 및 로그·PID 기록
# ───────────────────────────────────────────────────────────────────
echo "[INFO] 애플리케이션을 백그라운드에서 실행합니다..."
nohup java -jar "$JAR_FILE" >> "$LOG_FILE" 2>&1 &
NEW_PID=$!
echo "$NEW_PID" > "$PID_FILE"
echo "[INFO] 새 프로세스(PID: $NEW_PID)가 실행되었습니다."
echo "[INFO] 로그 파일: $LOG_FILE"
echo "[INFO] PID 파일: $PID_FILE"[linux] 쉘스크립트 내에서 nohup 실행하기
댓글 남기기