如何表示某个服务(任何服务)在特定远程端口上可用

如何表示某个服务(任何服务)在特定远程端口上可用

我正在使用dockerdocker-compose编写一个由其他几个服务组合而成的服务。由于内部服务相互服务,因此必须按照预定义的优先级启动它们。我发现最简单的方法是使用启动脚本运行每个服务(在其指定的容器中)以在实际运行容器的服务之前检查先决条件。以下是我现在正在使用的方法:

#!/bin/sh

cd /external-indexer

echo "Waitng for RabbitMQ on $RMQ_HOST:$RMQ_PORT"
until curl http://$RMQ_HOST:$RMQ_PORT/  > /dev/null 2>&1
do
  echo "$(date) - RabbitMQ is not ready yet"
  sleep 1
done
echo "$(date) - RabbitMQ is ready"

echo "Waitng for PostgreSQL on $PG_HOST:$PG_PORT"
until wget $PG_HOST:$PG_PORT -t 1 2>&1 | grep " connected"
do
    echo "$(date) - PostgreSQL is not ready yet"
    sleep 1
done
echo "$(date) - PostgreSQL is ready"

./run-service

如您所见,在启动当前服务之前,我正在等待其他两个服务(RabbitMQ 和 PostgreSQL)。而且它可以正常工作。但问题是 PostgreSQL 不提供 HTTP 协议,我唯一能找到它是否正在提供服务的方法就是在程序connected提供的响应中查找wget

我想知道是否有一种合法的方法可以做到这一点,无论端口上使用什么协议都可以。请记住,我不是在寻找可以协调整个网络的大型服务。我正在寻找一个小程序,就像这里提到的程序一样,它可以在容器中找到,并且一旦可以在远程端口上建立连接,它就会返回 true。

答案1

Telnet 通常用于快速检查连通性。

telnet <servername> <port number>

如果端口可访问,您应该会收到一条有关已连接的消息,如下所示:

$ telnet www.google.com 80
Trying 216.58.195.132...
Connected to www.google.com.
Escape character is '^]'.

还有网猫,这是另一个非常简单的网络工具,可以建立任意 TCP 和 UDP 连接。

相关内容