Skip to content

Prüfen, ob Postgresql lauscht

Wir brauchen Ihre Hilfe, um unsere Informatik-Rezensionen zu erweitern.

Lösung:

Sie können z.B. das Tool nmap verwenden:

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

Alternativ können Sie auch einfach "SELECT 1" mit psql ausführen und die Ausgabe überprüfen:

=$ 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?

Ich denke, Sie müssen besser definieren, was Sie erreichen wollen. Willst Du nur wissen, ob etwas auf einen bestimmten Punkt hört? Wenn PostgreSQL auf einem bestimmten Port lauscht? Ob PostgreSQL läuft und tatsächlich Verbindungen annimmt? Wenn Sie sich mit PostgreSQL verbinden, erfolgreich authentifizieren und Abfragen stellen können?

Eine Möglichkeit ist der Aufruf von psql aufzurufen, um eine Verbindung herzustellen und den Ergebniscode zu überprüfen. Versuchen Sie nicht, den Ausgabetext zu parsen, da dieser in verschiedene Sprachen übersetzt werden kann.

Besser ist es, die Client-Bibliothek für die Sprache Ihrer Wahl zu verwenden - 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 eines Verbindungsfehlers verraten Ihnen mehr darüber, warum die Verbindung fehlgeschlagen ist - auf diese Weise können Sie den Unterschied zwischen einem 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 (die SQLSTATE), um mehr über Fehler zu erfahren, die serverseitig generiert werden, wie z.B. Authentifizierungsfehler; bei clientseitigen Fehlern ist sie leer.

Wenn Sie nur sehen wollen, ob etwas auf einer bestimmten IP und einem TCP-Port lauscht, können Sie mit netcat (nur *nix) oder ein einfaches Skript in einer Sprache Ihrer Wahl verwenden, das einen Socket erstellt, ein connect() ausführt und den Socket schließt, wenn es eine erfolgreiche Antwort erhält. Zum Beispiel 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))            

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

Für einige Zwecke kann es auch nützlich sein, die netstat Werkzeug zu verwenden, um passiv aufzulisten, welche Prozesse an welchen Netzwerksockeln lauschen. Das eingebaute netstat unter Windows ist ziemlich hirntot, so dass Sie die Ausgabe mehr analysieren müssen als mit netstat für andere Plattformen, aber es wird die Aufgabe trotzdem erfüllen. Das Vorhandensein eines Sockets in netstat bedeutet allerdings nicht, dass die Verbindung erfolgreich sein wird. Wenn der Prozess auf irgendeine Weise fehlgeschlagen ist, so dass er nicht mehr funktioniert, aber immer noch läuft (in einer Endlosschleife feststeckt, durch einen Debugger blockiert ist, SIGSTOPusw.), dann wird er nicht auf einen aktuellen Verbindungsversuch reagieren.

Kurz und bündig

Im Einzelnen

Am schnellsten geht es, wenn man netcat auch bekannt als nc mit Timeout-Fähigkeit, wie hier beschrieben

Ergebnis: 0/1 bedeutet, dass Postgres arbeitet/nicht arbeitet

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

Eine andere, ebenfalls schnellere Möglichkeit, die bei mir funktioniert, ist die Verwendung von telnet wie hier beschrieben.

echo -e 'x1dclosex0d' | telnet YOUR_HOST PORT
# eg
echo -e 'x1dclosex0d' | telnet localhost 5432

Bewertungen und Kommentare

Denken Sie daran, dass Sie die Berechtigung haben, eine Bewertung hinzuzufügen, wenn sie hilfreich war.



Nutzen Sie unsere Suchmaschine

Suche
Generic filters

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.