You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.2 KiB
92 lines
2.2 KiB
#!/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
|
|
|