[FIXED] Solución robusta para detención de Node-RED
- 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 <noreply@anthropic.com>
This commit is contained in:
parent
5310adb62c
commit
89daa56b46
1 changed files with 107 additions and 59 deletions
164
bin/nodered.sh
164
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
|
||||
|
||||
# Enviar señal SIGTERM para terminar amigablemente
|
||||
kill "$PID"
|
||||
echo "Deteniendo Node-RED..."
|
||||
|
||||
# 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
|
||||
# Matar todos los procesos recursivamente y de forma agresiva
|
||||
kill_all_nodered() {
|
||||
echo "Buscando procesos Node-RED..."
|
||||
|
||||
# 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"
|
||||
# Buscar todos los procesos relacionados con Node-RED
|
||||
local NR_PIDS=$(pgrep -f "node-red" 2>/dev/null || echo "")
|
||||
|
||||
# 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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue