PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Controlla se Postgresql è in ascolto

Penso che tu debba definire meglio cosa stai cercando di ottenere. Vuoi solo sapere se qualcosa sta ascoltando su un certo punto? Se PostgreSQL è in ascolto su una determinata porta? Se PostgreSQL è in esecuzione e accetta effettivamente connessioni? Se riesci a connetterti a PostgreSQL, autenticarti correttamente ed emettere query?

Un'opzione è invocare psql per connettersi ad esso e controllare il codice del risultato. Non tentare di analizzare il testo di output, poiché è soggetto a traduzione in lingue diverse.

Meglio, usa la libreria client per la lingua che preferisci:psycopg2 per Python, PgJDBC per Java, la gemma Pg per Ruby, DBD::Pg per Perl, nPgSQL per C#, ecc. Questo è l'approccio che consiglierei. I dettagli SQLSTATE o dell'eccezione da qualsiasi errore di connessione ti diranno di più sul motivo per cui la connessione non è riuscita:in questo modo sarai in grado di distinguere tra il server non in ascolto, l'errore di autenticazione, ecc. Ad esempio, 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))

Ci sono dettagli sull'eccezione in ex.pgcode (il SQLSTATE ) per ulteriori informazioni sugli errori generati lato server, come errori di autenticazione; sarà vuoto per gli errori lato client.

Se vuoi solo vedere se qualcosa è in ascolto su una determinata porta IP e TCP, puoi usare netcat (solo *nix), o un semplice script nella lingua di tua scelta che crea un socket ed esegue un connect() quindi chiude il socket se ottiene una risposta positiva. Ad esempio, il seguente banale script 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))            

Lo stesso approccio si applica a qualsiasi linguaggio di programmazione, variano solo i dettagli della libreria socket e la gestione degli errori.

Per alcuni scopi può anche essere utile utilizzare il netstat strumento per elencare passivamente quali processi sono in ascolto su quali socket di rete. Il netstat integrato su Windows è abbastanza morto per il cervello, quindi devi eseguire più analisi dell'output rispetto a netstat per altre piattaforme, ma farà comunque il lavoro. La presenza di un socket in netstat non significa che la connessione ad esso avrà successo, però; se il processo ha fallito in qualche modo che lo lascia interrotto ma ancora in esecuzione (bloccato in un ciclo infinito, bloccato da un debugger, SIGSTOP ed, ecc.), quindi non risponderà a un tentativo di connessione effettivo.