fi
" || log_warn "Не удалось перезагрузить PHP-FPM (возможно нужен sudo)"
+# ===== ШАГ 7.1: Перезапуск yii queue/listen воркеров =====
+# Воркеры читают .env при старте и кэшируют autoload — без рестарта
+# изменения в коде/конфиге до них не доедут. См. инцидент 2026-05-07
+# (отозванный TELEGRAM_BOT_TOKEN_PROD держался в памяти 68 дней).
+log_info ""
+log_info "Перезапуск yii-queue воркеров..."
+ssh $SSH_OPTS "$REMOTE_USER@$REMOTE_HOST" "
+ if command -v supervisorctl &> /dev/null && sudo supervisorctl status yii-queue: > /dev/null 2>&1; then
+ sudo supervisorctl restart yii-queue: > /dev/null
+ # Orphan'ы (PPID=1) — supervisorctl их не трогает, нужен прямой kill
+ sleep 1
+ ORPHANS=\$(ps -eo pid=,ppid=,etimes=,args= \
+ | awk '\$2 == 1 && \$4 ~ /yii\$/ && \$5 == \"queue/listen\" && \$3 > 60 { print \$1 }')
+ if [ -n \"\$ORPHANS\" ]; then
+ echo \"Убиваем orphan queue/listen (PPID=1): \$(echo \$ORPHANS | tr '\n' ' ')\"
+ echo \"\$ORPHANS\" | xargs -r sudo kill 2>/dev/null || true
+ sleep 2
+ STILL=\$(ps -eo pid=,ppid=,args= \
+ | awk '\$2 == 1 && \$4 ~ /yii\$/ && \$5 == \"queue/listen\" { print \$1 }')
+ [ -n \"\$STILL\" ] && echo \"\$STILL\" | xargs -r sudo kill -9 2>/dev/null || true
+ fi
+ echo 'yii-queue воркеры перезапущены'
+ fi
+" || log_warn "Не удалось перезапустить yii-queue (нужны права sudo для supervisorctl)"
+
# ===== ШАГ 8: Миграции =====
echo ""
read -p "Запустить миграции? (y/n): " -n 1 -r
fi
fi
+# Перезапуск yii queue/listen воркеров.
+# .env читается воркером один раз при старте процесса; vendor/autoload
+# тоже закэширован в памяти. Без рестарта воркеры продолжат работать
+# с прежним токеном/кодом, и любое изменение в .env или коде задач до
+# них не доедет. Инцидент 2026-05-07: после ротации
+# TELEGRAM_BOT_TOKEN_PROD воркеры с uptime 68 дней продолжали слать с
+# отозванным токеном, выдавая 401 Unauthorized.
+if command -v supervisorctl &> /dev/null && supervisorctl status yii-queue: > /dev/null 2>&1; then
+ echo "Перезапуск yii-queue воркеров..."
+ supervisorctl restart yii-queue: > /dev/null
+ # Orphan-воркеры (PPID=1) — supervisorctl restart их НЕ трогает.
+ # Возникают, если supervisor когда-то перезапускали без остановки
+ # детей (или дети пережили краш родителя). Они держат старое
+ # окружение в памяти и параллельно с новыми воркерами потребляют
+ # из очереди. На erpp 2026-05-07 жили 10 таких orphan'ов с Feb27.
+ sleep 1
+ ORPHANS=$(ps -eo pid=,ppid=,etimes=,args= \
+ | awk '$2 == 1 && $4 ~ /yii$/ && $5 == "queue/listen" && $3 > 60 { print $1 }')
+ if [ -n "$ORPHANS" ]; then
+ echo "Найдены orphan queue/listen (PPID=1, etime>60s): $(echo $ORPHANS | tr '\n' ' ')"
+ echo "$ORPHANS" | xargs -r kill 2>/dev/null || true
+ sleep 2
+ STILL=$(ps -eo pid=,ppid=,args= \
+ | awk '$2 == 1 && $4 ~ /yii$/ && $5 == "queue/listen" { print $1 }')
+ if [ -n "$STILL" ]; then
+ echo "$STILL" | xargs -r kill -9 2>/dev/null || true
+ fi
+ fi
+ echo -e "${GREEN}✓ yii-queue воркеры перезапущены${NC}"
+fi
+
echo ""
echo "Проверьте работу сайта!"
echo "При проблемах выполните откат: ./rollback.sh"
fi
fi
+# Перезапуск yii queue/listen воркеров.
+# При rollback'е воркеры тоже должны быть рестартанутыми, иначе они
+# останутся с кодом/.env «нового» релиза в памяти, а сайт будет
+# использовать старый — рассинхрон. См. activate-release.sh для
+# подробностей про orphan'ы и инцидент 2026-05-07.
+if command -v supervisorctl &> /dev/null && supervisorctl status yii-queue: > /dev/null 2>&1; then
+ supervisorctl restart yii-queue: > /dev/null
+ sleep 1
+ ORPHANS=$(ps -eo pid=,ppid=,etimes=,args= \
+ | awk '$2 == 1 && $4 ~ /yii$/ && $5 == "queue/listen" && $3 > 60 { print $1 }')
+ if [ -n "$ORPHANS" ]; then
+ echo "$ORPHANS" | xargs -r kill 2>/dev/null || true
+ sleep 2
+ STILL=$(ps -eo pid=,ppid=,args= \
+ | awk '$2 == 1 && $4 ~ /yii$/ && $5 == "queue/listen" { print $1 }')
+ [ -n "$STILL" ] && echo "$STILL" | xargs -r kill -9 2>/dev/null || true
+ fi
+ echo -e "${GREEN}✓ yii-queue воркеры перезапущены${NC}"
+fi
+
echo ""
echo "Проверьте работу сайта!"