Réponses:
Le meilleur test pour voir si un serveur accepte des connexions est d'essayer de se connecter. Utilisez un client standard quel que soit le protocole utilisé par votre serveur et essayez une commande no-op.
Si vous voulez un client TCP ou UDP léger que vous pouvez piloter simplement à partir du shell, utilisez netcat . Comment programmer une conversation dépend du protocole; sur de nombreux protocoles, le serveur ferme la connexion sur une certaine entrée et netcat se ferme ensuite.
while ! echo exit | nc localhost 13000; do sleep 10; done
Vous pouvez également dire à netcat de quitter après avoir établi la connexion. Il retourne 1 s'il n'y a pas de connexion et 0 s'il y en a, nous nions sa sortie. Selon votre version de netcat, il peut prendre en charge l’une ou les deux commandes suivantes:
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
Une autre approche consiste à attendre que le processus serveur ouvre un socket en écoute.
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
Si vous utilisez Mac OS, netstat utilise un format de sortie légèrement différent. Vous voudrez donc de lire les informations suivantes:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
Ou vous voudrez peut-être cibler un ID de processus spécifique:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
Je ne vois aucun moyen de réagir au processus qui commence à écouter le socket (ce qui éviterait une approche par sondage) sans utiliser ptrace
.
nc -w 2 </dev/null >/dev/null
- si la connexion prend plus de 2 secondes, il expire et échoue - ce qui est pratique pour mon utilisation.
nc -q 1 localhost 13000 </dev/null
retourne immédiatement si aucun serveur n'écoute, mais avec un code d'erreur, la boucle la met en veille et réessaye quelques secondes plus tard.
Si vous avez bash et coreutils (par exemple, timeout, sleep), mais pas nc / lsof / netstat, vous pouvez utiliser cette solution qui utilise les sockets bash tcp magic:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
Après l' exemple précédent avec bash
tcp sockets magic, voici une version améliorée qui attend la connexion pendant un temps limité.
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
La différence est que si la connexion n’était pas disponible au cours de 15s
, elle ne sera pas bouclée indéfiniment, mais sera fermée avec le code d’erreur.
Ceci est utile dans les scripts d'init pour attendre la disponibilité / disponibilité du service après le démarrage.