Respuestas:
La mejor prueba para ver si un servidor está aceptando conexiones es intentar realmente conectarse. Use un cliente normal para cualquier protocolo que hable su servidor y pruebe un comando no-op.
Si desea un cliente TCP o UDP ligero que pueda manejar simplemente desde el shell, use netcat . Cómo programar una conversación depende del protocolo; muchos protocolos hacen que el servidor cierre la conexión en una determinada entrada, y netcat se cerrará.
while ! echo exit | nc localhost 13000; do sleep 10; done
También puede decirle a netcat que salga después de establecer la conexión. Devuelve 1 si no hay conexión y 0 si la hay, por lo que negamos su salida. Dependiendo de su versión de netcat, puede admitir uno o ambos de los siguientes comandos:
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
Un enfoque alternativo es esperar a que el proceso del servidor abra un socket de escucha.
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
Si estás en Mac OS, netstat usa un formato de salida ligeramente diferente, por lo que querrás el siguiente intead:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
O es posible que desee orientar un ID de proceso específico:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
No se me ocurre ninguna forma de reaccionar ante el proceso que comienza a escuchar el socket (lo que evitaría un enfoque de sondeo) sin usar ptrace
.
nc -w 2 </dev/null >/dev/null
, si la conexión tarda más de 2 segundos, se agota el tiempo de espera y falla, lo cual es útil para mi uso.
nc -q 1 localhost 13000 </dev/null
regresa inmediatamente si no hay ningún servidor escuchando, pero regresa con un código de error, por lo que el bucle lo hace dormir e intenta nuevamente unos segundos más tarde.
Si tiene bash y coreutils (por ejemplo, tiempo de espera, suspensión), pero no nc / lsof / netstat, puede usar esta solución que usa bash magic tcp sockets:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
Siguiendo el ejemplo anterior con bash
tcp sockets magic, aquí hay una versión mejorada que espera la conexión durante un tiempo limitado.
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
La diferencia es que si la conexión no estuvo disponible durante 15s
, no se repetirá para siempre, sino que saldrá con el código de error.
Esto es útil en los scripts de inicio para esperar la disponibilidad / disponibilidad del servicio después del inicio.