web-dev-qa-db-fra.com

Comment puis-je dire à un script d'attendre qu'un processus commence à accepter des demandes sur un port?

J'ai besoin d'une commande qui attendra un processus pour commencer à accepter des demandes sur un port spécifique.

Y a-t-il quelque chose à Linux qui fait ça?

while (checkAlive -Host localhost -port 13000 == false)
  do some waiting

...
33
Will

Le meilleur test pour voir si un serveur accepte les connexions consiste à essayer de se connecter. Utilisez un client régulier pour le protocole de votre serveur parle et essayez une commande no-op.

Si vous voulez un client léger TCP ou UDP, vous pouvez passer simplement à partir de la coque, utilisez-... NetCat . Comment programmer une conversation dépend du protocole; De nombreux protocoles ont le serveur fermer la connexion sur une certaine entrée et Netcat quittera ensuite.

while ! echo exit | nc localhost 13000; do sleep 10; done

Vous pouvez également dire à NETCAT de quitter après l'établissement de la connexion. Il retourne 1 s'il n'y a pas de connexion et 0 s'il y a donc nous annulons sa production. Selon votre version de Netcat, cela 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 approche alternative consiste à attendre que le processus serveur ouvre une prise d'écoute.

while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done

Si vous êtes sur Mac OS, NetStat utilise un format de sortie légèrement différent, vous souhaiteriez donc les estimes suivantes:

while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done

Ou vous voudrez peut-être cibler un identifiant de processus spécifique:

while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done

Je ne peux penser à aucun moyen de réagir au processus de commencer à écouter la prise (qui éviterait une approche de vote) à l'aide de ptrace.

Si vous avez Bash et Coreutils (E.G. Timeout, Sommeil), mais pas NC/LSOF/NetStat, vous pouvez utiliser cette solution qui utilise des prises Bash Magic TCP:

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
17
kanaka

Après le exemple précédent avec bash TCP Sockets Magic, voici une version améliorée qui attend la connexion au cours de la durée limitée.

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 pendant 15s, - il ne bougera pas pour toujours, mais sortez avec le code d'erreur.

Ceci est utile dans les scripts init pour attendre la préparation/disponibilité de service après le démarrage.

9
arma