it-swarm.com.de

Wie kann man mit netcat auf einen offenen Port warten?

Ich versuche, eine benutzerdefinierte Docker-Datei mit Jenkins darauf zu erstellen. Ich würde warten, bis Port 8080 geöffnet ist, anstatt einen hässlichen 'sleep 60' mit netcat zu machen, aber mit bash-Skripts und netcat nicht sehr zuversichtlich.

Hier ist ein Beispiel von dem, was ich versuche zu tun:

#!/bin/bash

opened=0

while [ "$opened"  == "0" ]; do
  echo "Waiting jenkins to launch on 8080..."
  nc -vz localhost 8080
done

echo "Jenkins launched"
36
FXG

Sie können netcat nicht so einstellen, dass gewartet wird, bis ein Port geöffnet ist. Sie müssen also einen Teil hinzufügen, bevor Sie die nächste Prüfung durchführen. Versuche dies:

#!/bin/bash

echo "Waiting jenkins to launch on 8080..."

while ! nc -z localhost 8080; do   
  sleep 0.1 # wait for 1/10 of the second before check again
done

echo "Jenkins launched"
71
user987339

Ich schlage folgende Liner vor:

## netcat version:
timeout 22 sh -c 'until nc -z $0 $1; do sleep 1; done' stackoverflow.com 443

## pure bash version:
timeout 22 bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/$0/$1; do sleep 1; done' stackoverflow.com 443

Beide Befehle werden beendet, sobald die Verbindung hergestellt ist. Es wird jede Sekunde bis zu 22 Sekunden lang versucht.

Beachten Sie, dass dank timeout der Befehls-Exit-Code 0 ist, wenn auf den Port zugegriffen werden kann, andernfalls 124 (falls innerhalb der angegebenen Zeit keine Verbindung hergestellt wurde).

10
Onlyjob

Wie vorgeschlagen hier , können Sie auch Folgendes tun, wenn Sie nc nicht installiert haben, sondern nur bash und coreutils:

#!/bin/bash

echo "Waiting jenkins to launch on 8080..."

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/8080"; do   
  sleep 1
done

echo "Jenkins launched"
7
Anthony O.

Ich habe festgestellt, dass dies ein häufiges Problem ist, um ein Dienstprogramm zu schreiben, das auf das Öffnen eines Ports wartet, mit einem optionalen Timeout:

# without timeout
wait-port localhost:8080

# timeout after a minute
wait-port -t 60000 localhost:8080

Es ist Open Source und verfügbar unter github.com/dwmkerr/wait-port . Hoffentlich finden andere es nützlich!

4
Dave Kerr

Um die Antwort von Benutzer987339 zu erweitern, können Sie ganz einfach auf einen Port in Ihrem Terminal warten:

waitport-Funktion

Fügen Sie diese Funktion zu Ihrer ~/.bashrc-Setup-Datei hinzu:

waitport() {
    while ! nc -z localhost $1 ; do sleep 1 ; done
}

Melden Sie sich ab und wieder an, um ~/.bashrc zu laden. Führen Sie dann diesen Befehl aus, um zu überprüfen, ob der Server von Port 3000 abgehört wird:

$ waitport 3000
Connection to localhost port 3000 [tcp/hbci] succeeded!

Dies wurde auf macOS validiert. Es funktioniert möglicherweise nicht unter Fedora/CentOS, da ihnen die -z-Option für netcat fehlt.

0
johntellsall