PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Überprüfen Sie, ob Postgresql zuhört

Ich denke, Sie müssen besser definieren, was Sie erreichen wollen. Wollen Sie nur wissen, ob irgendwas hört an einem bestimmten Punkt? Wenn PostgreSQL lauscht auf einem bestimmten Port? Wenn PostgreSQL ausgeführt wird und tatsächlich Verbindungen akzeptiert? Wenn Sie eine Verbindung zu PostgreSQL herstellen können, sich erfolgreich authentifizieren und Abfragen ausgeben?

Eine Möglichkeit besteht darin, psql aufzurufen um eine Verbindung herzustellen und den Ergebniscode zu überprüfen. Versuchen Sie nicht, den Ausgabetext zu parsen, da dieser in andere Sprachen übersetzt werden muss.

Verwenden Sie besser die Client-Bibliothek für die Sprache Ihrer Wahl - psycopg2 für Python, PgJDBC für Java, das Pg-Gem für Ruby, DBD::Pg für Perl, nPgSQL für C# usw. Dies ist der Ansatz, den ich empfehlen würde. Die SQLSTATE- oder Ausnahmedetails von Verbindungsfehlern verraten Ihnen mehr darüber, warum die Verbindung fehlgeschlagen ist. Auf diese Weise können Sie den Unterschied zwischen dem Server, der nicht zuhört, einem Authentifizierungsfehler usw. erkennen. Zum Beispiel in Python:

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

Es gibt Ausnahmedetails in ex.pgcode (der SQLSTATE ), um mehr über Fehler zu erfahren, die serverseitig generiert werden, wie z. B. Authentifizierungsfehler; Bei clientseitigen Fehlern bleibt es leer.

Wenn Sie nur sehen möchten, ob etwas auf einem bestimmten IP- und TCP-Port lauscht, können Sie netcat verwenden (nur *nix) oder ein einfaches Skript in der Sprache Ihrer Wahl, das einen Socket erstellt und ein connect() ausführt und dann den Socket schließt, wenn es eine erfolgreiche Antwort erhält. Beispielsweise das folgende triviale Python-Skript:

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))            

Derselbe Ansatz gilt für jede Programmiersprache, nur die Details der Socket-Bibliothek und der Fehlerbehandlung variieren.

Für manche Zwecke kann es auch sinnvoll sein, die netstat zu verwenden Tool, um passiv aufzulisten, welche Prozesse auf welchen Netzwerk-Sockets lauschen. Die eingebaute netstat unter Windows ist ziemlich hirntot, so dass Sie die Ausgabe mehr parsen müssen als mit netstat für andere Plattformen, aber es wird immer noch den Job machen. Das Vorhandensein eines Sockets in netstat bedeutet jedoch nicht, dass die Verbindung damit erfolgreich sein wird; wenn der Prozess auf irgendeine Weise fehlgeschlagen ist, sodass er kaputt ist, aber immer noch läuft (in einer Endlosschleife feststeckt, von einem Debugger blockiert wird, SIGSTOP ed usw.), dann reagiert es nicht auf einen tatsächlichen Verbindungsversuch.