web-dev-qa-db-fra.com

Comment attendre un port ouvert avec netcat?

J'essaie de créer un fichier de dock personnalisé avec des jenkins. Je voudrais attendre que le port 8080 soit ouvert au lieu de faire un "sommeil 60" moche avec netcat mais pas très confiant avec les scripts bash et netcat.

Voici un exemple de ce que j'essaie de faire:

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

Vous ne pouvez pas configurer netcat pour attendre qu'un port soit ouvert, vous devez donc ajouter une partie pour attendre avant la prochaine vérification. Essaye ça:

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

Je suggère les doublures suivantes:

## 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

Les deux commandes se terminent dès que la connexion est établie, en essayant chaque seconde jusqu'à 22 secondes.

Notez que, grâce à la commande timeout, le code de sortie est 0 lorsque le port est accessible, sinon 124 (si aucune connexion n’est établie dans le temps imparti).

10
Onlyjob

Comme suggéré ici , vous pouvez également procéder comme suit si vous n'avez pas installé nc mais seulement bash et 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.

J'ai trouvé que c'était un problème assez commun pour écrire un utilitaire qui attendait qu'un port s'ouvre, avec un délai d'expiration optionnel:

# without timeout
wait-port localhost:8080

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

Il est open source et disponible à l’adresse github.com/dwmkerr/wait-port . J'espère que d'autres le trouveront utile!

4
Dave Kerr

Pour développer la réponse de user987339, voici comment attendre facilement un port de votre terminal:

fonction waitport

Ajoutez cette fonction à votre fichier d'installation ~/.bashrc:

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

Déconnectez-vous puis reconnectez-vous pour charger ~/.bashrc. Ensuite, exécutez cette commande pour vérifier que le port 3000 est écouté par un serveur:

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

Ceci a été validé sur macOS. Cela pourrait ne pas fonctionner sur Fedora/CentOS, car l’option -z pour netcat ne.

0
johntellsall