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