Respostas:
O melhor teste para ver se um servidor está aceitando conexões é realmente tentar se conectar. Use um cliente comum para qualquer protocolo que seu servidor fale e tente um comando no-op.
Se você deseja um cliente TCP ou UDP leve, pode dirigir simplesmente a partir do shell, use o netcat . Como programar uma conversa depende do protocolo; muitos protocolos fazem com que o servidor feche a conexão em uma determinada entrada e o netcat será encerrado.
while ! echo exit | nc localhost 13000; do sleep 10; done
Você também pode dizer ao netcat para sair depois de estabelecer a conexão. Retorna 1 se não houver conexão e 0 se houver, e negamos sua saída. Dependendo da sua versão do netcat, ele pode oferecer suporte a um ou aos dois comandos a seguir:
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
Uma abordagem alternativa é aguardar o processo do servidor abrir um soquete de escuta.
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
Se você estiver no Mac OS, o netstat usa um formato de saída ligeiramente diferente; portanto, você deseja o seguinte:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
Ou você pode desejar segmentar um ID de processo específico:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
Não consigo pensar em nenhuma maneira de reagir ao processo que começa a ouvir o soquete (o que evitaria uma abordagem de votação) antes de usar ptrace
.
nc -w 2 </dev/null >/dev/null
- se a conexão demorar mais de 2 segundos, atinge o tempo limite e falha - o que é útil para o meu uso.
nc -q 1 localhost 13000 </dev/null
retorna imediatamente se nenhum servidor estiver escutando, mas retorna com um código de erro, portanto o loop faz com que ele durma e tente novamente alguns segundos depois.
Se você possui bash e coreutils (por exemplo, tempo limite, suspensão), mas não nc / lsof / netstat, pode usar esta solução que usa soquetes bash magic tcp:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
Seguindo o exemplo anterior com bash
tcp sockets magic, aqui está uma versão aprimorada que aguarda conexão durante um período limitado de tempo.
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
A diferença é que, se a conexão não estava disponível durante 15s
, - ela não funcionará para sempre, mas será encerrada com o código de erro.
Isso é útil nos scripts init para aguardar a disponibilidade / disponibilidade do serviço após a inicialização.