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"
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"
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).
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"
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!
Pour développer la réponse de user987339, voici comment attendre facilement un port de votre terminal:
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.