[FIXED] Mejora script nodered.sh para detección y terminación de procesos

- 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 <noreply@anthropic.com>
This commit is contained in:
Mauro Rosero P. 2025-03-23 12:34:15 -05:00
parent 56fc09621c
commit 5310adb62c
Signed by: mrosero
GPG key ID: 83BD2A5F674B7E26

View file

@ -130,39 +130,76 @@ start() {
} }
stop() { stop() {
if [ ! -f "$PID_FILE" ] || ! kill -0 "$(cat $PID_FILE)" 2>/dev/null; then # Verificar primero si el archivo PID existe y corresponde a un proceso válido
echo "Node-RED no está en ejecución." 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 # Limpiar archivos PID huérfanos si existen
[ -f "$PID_FILE" ] && rm -f "$PID_FILE" [ -f "$PID_FILE" ] && rm -f "$PID_FILE"
exit 1 echo "Node-RED detenido correctamente."
fi return 0
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 fi
rm -f "$PID_FILE" # Si no hay procesos de Node-RED en ejecución
echo "Node-RED detenido correctamente." 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() { 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 if [ -f "$PID_FILE" ] && kill -0 "$(cat $PID_FILE)" 2>/dev/null; then
echo "Node-RED está en ejecución:" echo "Node-RED está en ejecución:"
echo " - PID: $(cat $PID_FILE)" echo " - PID: $(cat $PID_FILE)"
@ -184,17 +221,59 @@ status() {
echo " - Estado: Proceso en ejecución pero no responde HTTP" echo " - Estado: Proceso en ejecución pero no responde HTTP"
fi fi
fi fi
else return 0
echo "Node-RED no está en ejecución."
# Limpiar archivos PID huérfanos si existen
[ -f "$PID_FILE" ] && rm -f "$PID_FILE"
fi 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() { restart() {
echo "Reiniciando Node-RED..." echo "Reiniciando Node-RED..."
stop 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 start
} }