it-swarm.com.de

Wie kann ich anhand eines Shell-Skripts überprüfen, ob ein bestimmter Port auf einem Computer geöffnet ist, und darauf basierend eine Aktion ausführen?

Ich führe mein unten stehendes Shell-Skript auf einem Computer aus, auf dem der C++ - Anwendungsserver auf Port 8080 ausgeführt wird, und im Shell-Skript führe ich eine URL aus und speichere die von dieser URL kommende Antwort in der DATA-Variablen.

Angenommen, derselbe App-Server ist nicht verfügbar, kann die URL nicht ausführen. Anschließend wird Retrying Again Ausgedruckt und 30 Sekunden lang in den Ruhezustand versetzt. Anschließend wird dieselbe URL erneut ausgeführt.

#!/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"

Und hier ist HOSTNAME der lokale Hostname des Servers, auf dem ich mein oben genanntes Shell-Skript ausführe.

Problemstellung: -

Ich versuche nun, wenn der Server nicht verfügbar ist, wird Retrying Again Ausgedruckt. Danach möchte ich überprüfen, ob Port 8080 Auf $HOSTNAME Geöffnet ist. oder nicht. Wenn nicht, bedeutet dies, dass der Server ausgefallen ist. Daher möchte ich den Server durch Ausführen dieses Befehls neu starten und dann 30 Sekunden lang schlafen, wie oben im Shell-Skript gezeigt.

/opt/app/test/start_stop.sh start

Ist dies hier in meinem obigen Shell-Skript möglich?

Ich führe dieses Shell-Skript unter Ubuntu 12.04 aus.

24
david

Mit dem Programm lsof können Sie überprüfen, welche Prozesse welche Ressourcen wie Dateien oder Ports verwenden.

So zeigen Sie an, welche Prozesse Port 8080 überwachen:

lsof -Pi :8080 -sTCP:LISTEN

In Ihrem Fall möchten Sie testen, ob ein Prozess 8080 abhört - der Rückgabewert dieses Befehls sagt Ihnen genau das. Es wird auch die PID des Prozesses gedruckt.

lsof -Pi :8080 -sTCP:LISTEN -t

Wenn Sie nur den Test ohne Ausgabe benötigen, leiten Sie ihn zu /dev/null:

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


Wenn Sie lokal mehrere Hostnamen mit mehreren IP-Adressen verwenden, geben Sie den Hostnamen ebenfalls an
lsof -Pi @someLocalName:8080 -sTCP:LISTEN

24
Volker Siegel

Einfachster Weg in Bash. Testen Sie, ob Ihr Port geöffnet ist.

(echo >/dev/tcp/localhost/8080) &>/dev/null && echo "TCP port 8080 open" || echo "TCP port 8080 close"

Ersetzen Sie das Echo durch das, was Sie wollen.

Oder Sie können nc verwenden.

nc -vz 127.0.0.1 8080

Kehrt zurück:

Die Verbindung zum 127.0.0.1 8080-Port [tcp/*] war erfolgreich

16
R J

Es ist auch nützlich, auf die Antwort von RJ einzugehen, in der nc vermerkt ist ... Nicht nur nc ist für eine schnelle Befehlszeilenabfrage nützlich

❯ nc -z -v -w5 127.0.0.1 8080
localhost [127.0.0.1] 8080 (http-alt) : Connection refused

es kann jedoch ohne -v verwendet werden, wenn die Lesbarkeit nicht das ist, wonach Sie suchen - z. B. zur Verwendung in einem Skript (der Exit-Code gibt an, ob der Port offen oder geschlossen ist).

❯ nc -z 127.0.0.1 8080

❯ echo $?             
1
1
thomp45793