From 89daa56b467711d74d1b6982876151b2d0628f44 Mon Sep 17 00:00:00 2001 From: "Mauro Rosero P." Date: Sun, 23 Mar 2025 12:37:39 -0500 Subject: [PATCH] =?UTF-8?q?[FIXED]=20Soluci=C3=B3n=20robusta=20para=20dete?= =?UTF-8?q?nci=C3=B3n=20de=20Node-RED?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reescrita la función stop para garantizar terminación completa de todos los procesos - Implementado mecanismo jerárquico de terminación: amigable → forzado → último recurso - Añadidos pasos de verificación adicionales para procesos persistentes - Mejorada función restart con múltiples intentos de terminación - Limpieza de archivos temporales y sockets para evitar conflictos - Mejor retroalimentación sobre procesos Node-RED en varios estados 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- bin/nodered.sh | 166 +++++++++++++++++++++++++++++++------------------ 1 file changed, 107 insertions(+), 59 deletions(-) diff --git a/bin/nodered.sh b/bin/nodered.sh index 9fb65e2..191033e 100755 --- a/bin/nodered.sh +++ b/bin/nodered.sh @@ -130,72 +130,99 @@ start() { } stop() { - # Verificar primero si el archivo PID existe y corresponde a un proceso válido - if [ -f "$PID_FILE" ] && kill -0 "$(cat $PID_FILE)" 2>/dev/null; then - echo "Deteniendo Node-RED (PID $(cat $PID_FILE))..." - local PID=$(cat "$PID_FILE") + # Variable para seguir si se detectaron procesos + local found_processes=0 + + echo "Deteniendo Node-RED..." + + # Matar todos los procesos recursivamente y de forma agresiva + kill_all_nodered() { + echo "Buscando procesos Node-RED..." - # Enviar señal SIGTERM para terminar amigablemente - kill "$PID" + # Buscar todos los procesos relacionados con Node-RED + local NR_PIDS=$(pgrep -f "node-red" 2>/dev/null || echo "") - # Esperar hasta 10 segundos para que el proceso termine - for i in {1..10}; do - if ! kill -0 "$PID" 2>/dev/null; then - break - fi - sleep 1 - echo -n "." - done - - # Si aún está en ejecución, forzar la terminación - if kill -0 "$PID" 2>/dev/null; then - echo "Forzando terminación..." - kill -9 "$PID" + # Si no se encontraron procesos + if [ -z "$NR_PIDS" ]; then + return 1 fi - rm -f "$PID_FILE" - echo "Node-RED detenido correctamente." - return 0 - fi - - # Si el archivo PID no existe o no es válido, buscar procesos de Node-RED - local NR_PIDS=$(pgrep -f "node-red" | tr "\n" " ") - - if [ -n "$NR_PIDS" ]; then - echo "Encontrados procesos Node-RED sin archivo PID: $NR_PIDS" - echo "Deteniendo procesos Node-RED..." + # Procesar cada PID encontrado + found_processes=1 + echo "Terminando procesos Node-RED: $NR_PIDS" + # Primera pasada: intento amigable (SIGTERM) for pid in $NR_PIDS; do - echo "Deteniendo proceso $pid..." - kill $pid - - # Esperar a que termine - for i in {1..5}; do - if ! kill -0 $pid 2>/dev/null; then - break - fi - sleep 1 - echo -n "." - done - - # Forzar terminación si es necesario - if kill -0 $pid 2>/dev/null; then - echo "Forzando terminación del proceso $pid..." - kill -9 $pid - fi + echo "Enviando SIGTERM al proceso $pid..." + kill $pid 2>/dev/null done - # Limpiar archivos PID huérfanos si existen - [ -f "$PID_FILE" ] && rm -f "$PID_FILE" - echo "Node-RED detenido correctamente." + # Esperar un momento + sleep 2 + + # Segunda pasada: verificar y forzar si es necesario + local REMAINING_PIDS=$(pgrep -f "node-red" 2>/dev/null || echo "") + if [ -n "$REMAINING_PIDS" ]; then + echo "Algunos procesos persisten. Forzando terminación (SIGKILL)..." + for pid in $REMAINING_PIDS; do + echo "Forzando terminación del proceso $pid..." + kill -9 $pid 2>/dev/null + done + + # Esperar un poco más + sleep 1 + + # Verificación final + local FINAL_CHECK=$(pgrep -f "node-red" 2>/dev/null || echo "") + if [ -n "$FINAL_CHECK" ]; then + echo "ADVERTENCIA: Algunos procesos de Node-RED aún persisten: $FINAL_CHECK" + echo "Puede ser necesario reiniciar el sistema para liberarlos completamente." + return 2 + fi + fi + return 0 + } + + # Verificar primero si el archivo PID existe + if [ -f "$PID_FILE" ]; then + echo "Usando archivo PID: $PID_FILE" + if kill -0 "$(cat $PID_FILE)" 2>/dev/null; then + local PID=$(cat "$PID_FILE") + echo "PID válido encontrado: $PID" + + # Enviar señal SIGTERM para terminar amigablemente + kill $PID 2>/dev/null + found_processes=1 + + # Esperar brevemente + sleep 2 + else + echo "Archivo PID existe pero el proceso no está activo" + fi + + # Eliminar el archivo PID en cualquier caso + rm -f "$PID_FILE" fi - # Si no hay procesos de Node-RED en ejecución - echo "Node-RED no está en ejecución." - # Limpiar archivos PID huérfanos si existen - [ -f "$PID_FILE" ] && rm -f "$PID_FILE" - return 1 + # Buscar y matar todos los procesos de Node-RED + kill_all_nodered + + # Usar pkill como último recurso + pkill -9 -f "node-red" 2>/dev/null + + # Verificación final y mensaje + if pgrep -f "node-red" > /dev/null; then + echo "ERROR: No se pudo detener completamente Node-RED." + echo "Verifique manualmente los procesos con: ps aux | grep node-red" + return 1 + elif [ $found_processes -eq 1 ]; then + echo "Node-RED detenido correctamente." + return 0 + else + echo "No se encontraron procesos de Node-RED en ejecución." + return 1 + fi } status() { @@ -267,13 +294,34 @@ status() { restart() { echo "Reiniciando Node-RED..." + + # Forzar detención completa stop - # Asegurar que todos los procesos node-red estén detenidos + + # Verificación adicional y limpieza + for i in {1..3}; do + if pgrep -f "node-red" > /dev/null; then + echo "Intento adicional $i: Forzando terminación de procesos persistentes..." + pkill -9 -f "node-red" 2>/dev/null + sleep 2 + else + break + fi + done + + # Comprobar una última vez if pgrep -f "node-red" > /dev/null; then - echo "Todavía hay procesos Node-RED en ejecución. Intentando forzar terminación..." - pkill -9 -f "node-red" - sleep 2 + echo "ADVERTENCIA: No fue posible detener completamente Node-RED." + echo "Los nuevos procesos podrían comportarse de manera inesperada." fi + + # Limpiar cualquier archivo temporal o socket que pudiera causar problemas + rm -f /tmp/node-red-*.sock 2>/dev/null + + # Esperar a que el sistema se estabilice + sleep 3 + + # Iniciar Node-RED start }