bash – ¿Cómo verificar si un puerto en particular está abierto en una máquina desde un script de shell y realizar una acción basada en eso?

Pregunta:

Estoy ejecutando mi siguiente script de shell en una máquina en la que el servidor de aplicaciones c ++ se está ejecutando en el puerto 8080 y en el script de shell estoy ejecutando una URL y almacena la respuesta que proviene de esa URL en la variable DATA.

Pero suponga que si el mismo servidor de aplicaciones está inactivo, entonces no podrá ejecutar la URL y luego imprimirá Retrying Again y dormirá durante 30 segundos y luego ejecutará la misma URL nuevamente.

#!/bin/bash

HOSTNAME=$hostname
DATA=""
RETRY=15

echo $HOSTNAME

while [ $RETRY -gt 0 ]
do
    DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/beat)
    if [ $? -eq 0 ]
    then
        break
    else
        echo "Retrying Again" >&2

        # restart the server

        let RETRY-=1
        sleep 30
    fi
done

echo "Server is UP"

Y aquí HOSTNAME es el nombre de host local del servidor en el que estoy ejecutando mi script de shell anterior.

Planteamiento del problema:-

Ahora lo que estoy tratando de hacer es, si el servidor está inactivo, entonces se imprimirá Retrying Again así que después de eso quiero verificar si el puerto 8080 está abierto en $HOSTNAME o no. De lo contrario, significa que el servidor está inactivo, por lo que quiero reiniciar el servidor ejecutando este comando y luego dormir durante 30 segundos como se muestra arriba en el script de shell.

/opt/app/test/start_stop.sh start

¿Es posible hacer esto aquí en mi script de shell anterior?

Estoy ejecutando este script de shell en Ubuntu 12.04.

Respuesta:

El programa lsof permite verificar qué procesos están usando qué recursos, como archivos o puertos.

Para mostrar qué procesos están escuchando en el puerto 8080:

lsof -Pi :8080 -sTCP:LISTEN

En su caso, desea probar si un proceso está escuchando en 8080; el valor de retorno de este comando le dice exactamente eso. También imprime el pid del proceso.

lsof -Pi :8080 -sTCP:LISTEN -t

Si solo necesita la prueba, sin salida, redirija a /dev/null :

if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null ; then
    echo "running"
else
    echo "not running"
fi

Si utiliza varios nombres de host con varias direcciones IP localmente, especifique el nombre de host también como
lsof -Pi @someLocalName:8080 -sTCP:LISTEN

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım