Preciso de um comando que aguarde um processo 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
...
Preciso de um comando que aguarde um processo 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
...
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:
fonte
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.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.
fonte