检查Postgresql是否在监听

时间:2013-06-25 17:16:01

标签: database postgresql boolean port ip-address

给定IP地址和端口号,是否可以检查具有该IP地址的机器是否在指定端口上监听Postgresql?如果是这样,怎么样?

我只想获取Postgresql是否正在侦听指定机器的指定端口的布尔值。

3 个答案:

答案 0 :(得分:8)

您可以使用nmap工具:

=$ sudo nmap -v -p 5930 127.0.0.1

Starting Nmap 6.00 ( http://nmap.org ) at 2013-06-25 19:28 CEST
Initiating SYN Stealth Scan at 19:28
Scanning localhost (127.0.0.1) [1 port]
Discovered open port 5930/tcp on 127.0.0.1
Completed SYN Stealth Scan at 19:28, 0.03s elapsed (1 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000045s latency).
PORT     STATE SERVICE
5930/tcp open  unknown

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
           Raw packets sent: 1 (44B) | Rcvd: 2 (88B)

或者你可以用psql“SELECT 1”,并检查输出:

=$ psql -h 127.0.0.1 -p 5930 -c "select 1"
 ?column? 
----------
        1
(1 row)

=$ psql -h 127.0.0.1 -p 5940 -c "select 1"
psql: could not connect to server: Connection refused
        Is the server running on host "127.0.0.1" and accepting
        TCP/IP connections on port 5940?

答案 1 :(得分:6)

我认为你需要定义你想要达到的目标。你只是想知道任何是否在某一点上听?如果 PostgreSQL 正在侦听给定端口?如果PostgreSQL正在运行并实际接受连接?如果您可以连接到PostgreSQL,验证成功并发出查询?

一个选项是调用psql连接到它并检查结果代码。不要尝试解析输出文本,因为它可以翻译成不同的语言。

更好的是,将客户端库用于您选择的语言 - 用于Python的psycopg2,用于Java的PgJDBC,用于Ruby的Pg gem,用于Perl的DBD::Pg,用于C#的nPgSQL等。这是我推荐的方法。来自任何连接错误的SQLSTATE或异常详细信息将告诉您更多关于连接失败的原因 - 您将能够通过这种方式区分服务器未监听,身份验证失败等。例如,在Python中:

import psycopg2
try:
    conn = psycopg2.connect("host=localhost dbname=postgres")
    conn.close();
except psycopg2.OperationalError as ex:
    print("Connection failed: {0}".format(ex))

ex.pgcodeSQLSTATE)中有一些异常详细信息可以告诉您有关服务器端生成的错误的更多信息,例如身份验证失败;对于客户端错误,它将是空的。

如果您只想查看某事是否正在侦听给定的IP和TCP端口,您可以使用netcat(仅限* nix)或使用语言的简单脚本您选择创建套接字并执行connect()然后关闭套接字,如果它获得成功响应。例如,以下简单的Python脚本:

import socket                                                                                                                                                              
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.connect(('localhost',5432))
    s.close()
except socket.error as ex:
    print("Connection failed with errno {0}: {1}".format(ex.errno, ex.strerror))            

同样的方法适用于任何编程语言,只是套接字库的细节和错误处理各不相同。

出于某些目的,使用netstat工具被动地列出哪些进程正在侦听哪些网络套接字也很有用。 Windows上的内置netstat非常难以理解,因此对于其他平台,您必须对输出进行更多的解析而不是netstat,但它仍然可以完成这项工作。 netstat中存在套接字并不意味着连接它会成功;如果进程以某种方式失败而导致其崩溃但仍在运行(陷入无限循环,被调试器阻塞,SIGSTOP ed等),那么它将不会响应实际的连接尝试。

答案 2 :(得分:2)

简介

详细信息

最快的方法是将netcat也称为nc,并将超时功能用作共享here

结果为0/1表示Postgres工作/不工作

echo 'QUIT' | nc -w SECONDS YOUR_HOST PORT; echo $?
# eg
echo 'QUIT' | nc -w 1       localhost 5432; echo $?

对我有用的另一种更快的方法是使用here中讨论过的telnet

echo -e '\x1dclose\x0d' | telnet YOUR_HOST PORT
# eg
echo -e '\x1dclose\x0d' | telnet localhost 5432