From 5310adb62c2167c049d0280300bb268b8f9d3f6f Mon Sep 17 00:00:00 2001 From: "Mauro Rosero P." Date: Sun, 23 Mar 2025 12:34:15 -0500 Subject: [PATCH] =?UTF-8?q?[FIXED]=20Mejora=20script=20nodered.sh=20para?= =?UTF-8?q?=20detecci=C3=B3n=20y=20terminaci=C3=B3n=20de=20procesos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Corregido problema al detener Node-RED cuando el PID file no existe - Implementada búsqueda avanzada de procesos node-red activos - Mejorado status para detectar procesos sin archivo PID - Añadida información detallada sobre procesos node-red en ejecución - Optimizada función restart para garantizar terminación completa - Mejor manejo de errores y mensajes de estado 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- bin/nodered.sh | 141 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 110 insertions(+), 31 deletions(-) diff --git a/bin/nodered.sh b/bin/nodered.sh index 0030388..9fb65e2 100755 --- a/bin/nodered.sh +++ b/bin/nodered.sh @@ -130,39 +130,76 @@ start() { } stop() { - if [ ! -f "$PID_FILE" ] || ! kill -0 "$(cat $PID_FILE)" 2>/dev/null; then - echo "Node-RED no está en ejecución." + # 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") + + # Enviar señal SIGTERM para terminar amigablemente + kill "$PID" + + # 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" + 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..." + + 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 + done + # Limpiar archivos PID huérfanos si existen [ -f "$PID_FILE" ] && rm -f "$PID_FILE" - exit 1 - fi - - echo "Deteniendo Node-RED (PID $(cat $PID_FILE))..." - local PID=$(cat "$PID_FILE") - - # Enviar señal SIGTERM para terminar amigablemente - kill "$PID" - - # 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" + echo "Node-RED detenido correctamente." + return 0 fi - rm -f "$PID_FILE" - echo "Node-RED detenido correctamente." + # 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 } status() { + # Primera verificación: archivo PID existe y el proceso está en ejecución if [ -f "$PID_FILE" ] && kill -0 "$(cat $PID_FILE)" 2>/dev/null; then echo "Node-RED está en ejecución:" echo " - PID: $(cat $PID_FILE)" @@ -184,17 +221,59 @@ status() { echo " - Estado: Proceso en ejecución pero no responde HTTP" fi fi - else - echo "Node-RED no está en ejecución." - # Limpiar archivos PID huérfanos si existen - [ -f "$PID_FILE" ] && rm -f "$PID_FILE" + return 0 fi + + # Segunda verificación: buscar procesos de Node-RED sin archivo PID + local NR_PIDS=$(pgrep -f "node-red" | tr "\n" " ") + + if [ -n "$NR_PIDS" ]; then + echo "Node-RED está en ejecución, pero sin archivo PID correcto:" + + for pid in $NR_PIDS; do + echo " - PID: $pid" + + # Mostrar información adicional si está disponible + if command -v ps &>/dev/null; then + local cmd_line=$(ps -p $pid -o cmd= 2>/dev/null) + [ -n "$cmd_line" ] && echo " - Comando: $cmd_line" + + local start_time=$(ps -p $pid -o lstart= 2>/dev/null) + [ -n "$start_time" ] && echo " - Iniciado: $start_time" + fi + done + + echo " - URL: http://localhost:$NODE_RED_PORT (probable)" + + # Verificar si el servicio está realmente respondiendo + if command -v curl &>/dev/null; then + if curl -s "http://localhost:$NODE_RED_PORT" >/dev/null; then + echo " - Estado: Respondiendo" + else + echo " - Estado: Proceso en ejecución pero no responde HTTP" + fi + fi + + echo "NOTA: Ejecute 'stop' y 'start' para regenerar el archivo PID correcto." + return 0 + fi + + # Si no se encontró ningún proceso + echo "Node-RED no está en ejecución." + # Limpiar archivos PID huérfanos si existen + [ -f "$PID_FILE" ] && rm -f "$PID_FILE" + return 1 } restart() { echo "Reiniciando Node-RED..." stop - sleep 2 + # Asegurar que todos los procesos node-red estén detenidos + 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 + fi start }