#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LOG_DIR="$SCRIPT_DIR/logs" PID_FILE="$LOG_DIR/server.pid" LOG_FILE="$LOG_DIR/server.log" mkdir -p "$LOG_DIR" PORT="${PORT:-}" if [[ -z "$PORT" && -f "$SCRIPT_DIR/.env" ]]; then PORT="$(grep -E '^PORT=' "$SCRIPT_DIR/.env" | tail -n 1 | cut -d '=' -f 2- | tr -d '\r' || true)" fi PORT="${PORT:-5000}" find_project_server_pids() { pgrep -f "node src/server.js" | while read -r pid; do [[ -n "$pid" ]] || continue [[ -d "/proc/$pid" ]] || continue local cwd cwd="$(readlink -f "/proc/$pid/cwd" 2>/dev/null || true)" if [[ "$cwd" == "$SCRIPT_DIR" ]]; then echo "$pid" fi done } stop_existing_server() { local pids pids="$(find_project_server_pids || true)" if [[ -z "$pids" ]]; then echo "No existing server process found for $SCRIPT_DIR" return fi echo "Stopping existing server process(es): $pids" while read -r pid; do [[ -n "$pid" ]] || continue kill "$pid" 2>/dev/null || true done <<< "$pids" sleep 2 local remaining remaining="$(find_project_server_pids || true)" if [[ -n "$remaining" ]]; then echo "Force killing remaining process(es): $remaining" while read -r pid; do [[ -n "$pid" ]] || continue kill -9 "$pid" 2>/dev/null || true done <<< "$remaining" fi } start_server() { cd "$SCRIPT_DIR" echo "Starting server from $SCRIPT_DIR on port $PORT" nohup node src/server.js >> "$LOG_FILE" 2>&1 & local pid=$! echo "$pid" > "$PID_FILE" echo "Started PID: $pid" } show_status() { sleep 2 echo echo "Active project server process(es):" find_project_server_pids || true echo echo "Port check:" ss -lntp 2>/dev/null | grep ":$PORT" || true echo echo "Recent log output:" tail -n 30 "$LOG_FILE" 2>/dev/null || true } stop_existing_server start_server show_status