64 lines
1.7 KiB
Bash
Executable File
64 lines
1.7 KiB
Bash
Executable File
#!/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."
|