#!/usr/bin/env bash # stop-stack.sh — ferma i processi avviati da start-stack.sh. # Legge i PIDs da var/run/asf-stack.pids, oppure cerca per pattern. set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PID_FILE="$ROOT_DIR/var/run/asf-stack.pids" echo "ASF stack STOP $(date '+%F %T %Z')" echo stop_group() { local pid="$1" name="$2" if ! kill -0 "$pid" 2>/dev/null; then echo " ✗ $name (pid=$pid) già spento" return 0 fi echo -n " ⏹ $name pid=$pid → " kill -TERM "$pid" 2>/dev/null || true local w=0 while [ $w -lt 8 ]; do kill -0 "$pid" 2>/dev/null || break sleep 1; w=$((w+1)) done if kill -0 "$pid" 2>/dev/null; then echo -n "SIGKILL " kill -9 "$pid" 2>/dev/null || true sleep 1 fi kill -0 "$pid" 2>/dev/null && echo "FAIL (ancora vivo)" || echo "ok" } stop_patterns() { echo "[fallback] kill via pattern match…" for pattern in \ "uvicorn app.main:app" \ "next dev" "next-server" \ "python -m app.worker" "asf-worker.*run_worker"; do pids=$(pgrep -af "$pattern" 2>/dev/null | awk '{print $1}' || true) [ -z "$pids" ] && continue echo " pattern '$pattern' → pids=$pids" for p in $pids; do stop_group "$p" "$pattern"; done done } if [ -f "$PID_FILE" ]; then echo "[from pidfile] $PID_FILE" while IFS=' ' read -r name pid rest; do [ -z "${name:-}" ] && continue [ -z "${pid:-}" ] && continue stop_group "$pid" "$name" done < "$PID_FILE" rm -f "$PID_FILE" else echo "[no pidfile $PID_FILE]" stop_patterns fi # final sweep echo echo "ports still listening:" ss -ltnp 2>/dev/null | grep -E ":(8000|3000) " || echo " → nessuna porta 8000 / 3000 usata (ok)." echo "done."