sql >> Databasteknik >  >> RDS >> PostgreSQL

Kontrollera om Postgresql lyssnar

Jag tror att du måste definiera vad du försöker uppnå bättre. Vill du bara veta om något lyssnar på en viss punkt? Om PostgreSQL lyssnar på en viss port? Om PostgreSQL körs och faktiskt accepterar anslutningar? Om du kan ansluta till PostgreSQL, autentisera framgångsrikt och utfärda frågor?

Ett alternativ är att anropa psql för att ansluta till den och kontrollera resultatkoden. Försök inte att analysera den utgående texten, eftersom den kan översättas till olika språk.

Bättre, använd klientbiblioteket för det språk du väljer - psycopg2 för Python, PgJDBC för Java, Pg pärlan för Ruby, DBD::Pg för Perl, nPgSQL för C#, etc. Detta är tillvägagångssättet jag skulle rekommendera. SQLSTATE- eller undantagsdetaljerna från ett anslutningsfel kommer att berätta mer om varför anslutningen misslyckades - du kommer att kunna se skillnaden mellan servern som inte lyssnar, autentiseringsfel, etc på detta sätt. Till exempel i Python:

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

Det finns undantagsdetaljer i ex.pgcode (SQLSTATE ) för att berätta mer om fel som genereras på serversidan, som autentiseringsfel; det kommer att vara tomt för fel på klientsidan.

Om du bara vill se om något lyssnar på en given IP- och TCP-port kan du använda netcat (*nix only), eller ett enkelt skript på det språk du väljer som skapar en socket och gör en connect() och stänger sedan socket om den får ett lyckat svar. Till exempel följande triviala 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))            

Samma tillvägagångssätt gäller i alla programmeringsspråk, bara detaljerna i socketbiblioteket och felhanteringen varierar.

För vissa ändamål kan det också vara användbart att använda netstat verktyg för att passivt lista vilka processer som lyssnar på vilka nätverksuttag. Den inbyggda netstat på Windows är ganska hjärndött så du måste göra mer analys av utdata än med netstat för andra plattformar, men det kommer fortfarande att göra jobbet. Förekomsten av ett uttag i netstat betyder dock inte att det kommer att lyckas att ansluta till det; om processen har misslyckats på något sätt som gör att den är trasig men fortfarande körs (fast i en oändlig loop, blockerad av en debugger, SIGSTOP ed, etc) så kommer den inte att svara på ett verkligt anslutningsförsök.



  1. SQL-fråga med koppling för att få kapslad array av objekt

  2. Postgresql-fråga för att få antal per månader inom ett år

  3. Hur kontrollerar man om en postgres-användare finns?

  4. SQLite och databasinitiering