fix find_free_port: single ss call, grep for :PORT pattern

This commit is contained in:
Дмитрий Мамедов
2026-06-10 17:51:09 +03:00
parent e608545e1a
commit e1da269c08

View File

@@ -18,12 +18,12 @@ step() { echo -e "\n${CYAN}━━━ $1 ━━━${NC}"; }
mark_done() { echo "$1" >> "$PROGRESS_FILE"; } mark_done() { echo "$1" >> "$PROGRESS_FILE"; }
is_done() { grep -qx "$1" "$PROGRESS_FILE" 2>/dev/null; } is_done() { grep -qx "$1" "$PROGRESS_FILE" 2>/dev/null; }
# ─── Find free port (check + increment until free) ────────────── # ─── Find free port (check via ss, single pass) ────────────────
find_free_port() { find_free_port() {
local port=$1 max=$2 local port=$1 max=$2
max="${max:-65535}" max="${max:-65535}"
while [ "$port" -le "$max" ]; do while [ "$port" -le "$max" ]; do
if ! ss -tlnp "sport = :$port" 2>/dev/null | grep -q .; then if ! ss -tlnp 2>/dev/null | grep -q ":$port "; then
echo "$port" echo "$port"
return 0 return 0
fi fi
@@ -213,7 +213,7 @@ for pair in "POSTGRES_PORT:5432" "REDIS_PORT:6379" "RABBITMQ_PORT:5672" "RABBITM
current=$(grep "^${var}=" "$INSTALL_DIR/.env" 2>/dev/null | cut -d= -f2) || true current=$(grep "^${var}=" "$INSTALL_DIR/.env" 2>/dev/null | cut -d= -f2) || true
current="${current:-$default}" current="${current:-$default}"
if ss -tlnp "sport = :$current" 2>/dev/null | grep -q .; then if ss -tlnp 2>/dev/null | grep -q ":$current "; then
warn "Port $current ($var) is busy — finding free port..." warn "Port $current ($var) is busy — finding free port..."
new_port=$(find_free_port "$((current + 1))" 2>/dev/null) || new_port=$((current + 100)) new_port=$(find_free_port "$((current + 1))" 2>/dev/null) || new_port=$((current + 100))
set_env "$var" "$new_port" set_env "$var" "$new_port"