Como posso dizer a um script para esperar que um processo comece a aceitar solicitações em uma porta?

30

Eu preciso de um comando que espere por um processo para começar a aceitar solicitações em uma porta específica.

Existe algo no linux que faz isso?

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

...
    
por Will 31.12.2010 / 16:53

3 respostas

46

O melhor teste para ver se um servidor está aceitando conexões é realmente tentar se conectar. Use um cliente regular para qualquer protocolo que seu servidor fale e tente um comando no-op.

Se você quer um cliente TCP ou UDP leve, você pode dirigir simplesmente a partir do shell, use netcat . Como programar uma conversa depende do protocolo; muitos protocolos fazem o servidor fechar a conexão em uma determinada entrada, e o netcat então sairá.

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. Ele retorna 1 se não houver conexão e 0 se houver, então negamos sua saída. Dependendo da sua versão do netcat, ele pode suportar um ou ambos dos seguintes comandos:

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 é esperar que o processo do servidor abra um soquete de escuta.

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

Ou talvez você queira 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 escutar o soquete (o que evitaria uma abordagem de pesquisa) com o uso de ptrace .

    
por 31.12.2010 / 17:23
15

Se você tem bash e coreutils (por exemplo, tempo limite, sleep), mas não nc / lsof / netstat, você pode usar essa solução que usa sockets bash magic tcp:

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
    
por 07.08.2014 / 19:31
5

Seguindo o exemplo anterior com bash tcp sockets magic, aqui está uma versão aprimorada que aguarda conexão durante um período de tempo limitado.

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 estiver disponível durante 15s , ela não será loop para sempre, mas sairá com o código de erro.

Isso é útil em scripts init para aguardar disponibilidade / disponibilidade do serviço após a inicialização.

    
por 04.03.2017 / 16:10