#!/usr/bin/env bash # # slack-notifier 백그라운드 실행 스크립트 (systemd 없이 간단 운영용). # # ./deploy/run.sh start [dev|prod] # 백그라운드 시작 (기본 prod) # ./deploy/run.sh stop # 종료 # ./deploy/run.sh restart [dev|prod] # 재시작 # ./deploy/run.sh status # 상태 확인 # ./deploy/run.sh logs # 구조적 로그(app.log) 실시간 # # 바이너리(slack-notifier)와 .env.{env} 는 프로젝트 루트에 있어야 한다. set -euo pipefail # 스크립트 위치(deploy/) 기준으로 프로젝트 루트 결정 APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$APP_DIR" BIN="./slack-notifier" ENV="${2:-prod}" # 기본 prod (dev 도 가능) PID_FILE="$APP_DIR/run/slack-notifier.pid" CONSOLE_LOG="$APP_DIR/logs/console.log" # stdout/stderr (앱 시작 전 출력·패닉 포함) mkdir -p "$APP_DIR/run" "$APP_DIR/logs" is_running() { [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null } start() { if is_running; then echo "이미 실행 중 (pid $(cat "$PID_FILE"))" exit 0 fi if [[ ! -x "$BIN" ]]; then echo "바이너리가 없거나 실행 권한이 없음: $BIN" echo " → make build-linux 후 이 디렉터리에 두고 chmod +x 하세요" exit 1 fi nohup "$BIN" -env "$ENV" >>"$CONSOLE_LOG" 2>&1 & echo $! >"$PID_FILE" sleep 1 if is_running; then echo "시작됨 (pid $(cat "$PID_FILE"), env=$ENV)" else echo "시작 실패 — 마지막 로그:" tail -n 20 "$CONSOLE_LOG" rm -f "$PID_FILE" exit 1 fi } stop() { if ! is_running; then echo "실행 중이 아님" rm -f "$PID_FILE" return 0 fi local pid pid="$(cat "$PID_FILE")" kill "$pid" 2>/dev/null || true for _ in $(seq 1 10); do is_running || break sleep 0.5 done if is_running; then echo "강제 종료(kill -9)" kill -9 "$pid" 2>/dev/null || true fi rm -f "$PID_FILE" echo "종료됨" } case "${1:-}" in start) start ;; stop) stop ;; restart) stop start ;; status) if is_running; then echo "running (pid $(cat "$PID_FILE"))" else echo "stopped" fi ;; logs) tail -f "$APP_DIR/logs/app.log" ;; *) echo "사용법: $0 {start|stop|restart|status|logs} [dev|prod]" exit 1 ;; esac