PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Vérifiez si Postgresql écoute

Je pense que vous devez définir ce que vous essayez de mieux réaliser. Voulez-vous simplement savoir si quelque chose écoute sur un certain point? Si PostgreSQL écoute sur un port donné ? Si PostgreSQL est en cours d'exécution et accepte réellement les connexions ? Si vous pouvez vous connecter à PostgreSQL, vous authentifier avec succès et émettre des requêtes ?

Une option consiste à invoquer psql pour vous y connecter et vérifier le code de résultat. N'essayez pas d'analyser le texte de sortie, car il est susceptible d'être traduit dans différentes langues.

Mieux, utilisez la bibliothèque cliente pour la langue de votre choix - psycopg2 pour Python, PgJDBC pour Java, la gemme Pg pour Ruby, DBD::Pg pour Perl, nPgSQL pour C#, etc. C'est l'approche que je recommanderais. Le SQLSTATE ou les détails de l'exception de toute erreur de connexion vous en diront plus sur la raison de l'échec de la connexion - vous pourrez ainsi faire la différence entre le serveur qui n'écoute pas, l'échec de l'authentification, etc. Par exemple, en Python :

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

Il y a des détails d'exception dans ex.pgcode (le SQLSTATE ) pour vous en dire plus sur les erreurs générées côté serveur, comme les échecs d'authentification ; il sera vide pour les erreurs côté client.

Si vous voulez juste voir si quelque chose écoute sur un port IP et TCP donné, vous pouvez utiliser netcat (*nix uniquement), ou un simple script dans le langage de votre choix qui crée un socket et fait un connect() puis ferme le socket s'il obtient une réponse positive. Par exemple, le script Python trivial suivant :

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

La même approche s'applique à n'importe quel langage de programmation, seuls les détails de la bibliothèque de sockets et la gestion des erreurs varient.

À certaines fins, il peut également être utile d'utiliser le netstat outil pour lister passivement quels processus écoutent sur quelles sockets réseau. Le netstat intégré sous Windows, c'est plutôt mort de cerveau, vous devez donc faire plus d'analyse de la sortie qu'avec netstat pour d'autres plates-formes, mais il fera toujours le travail. La présence d'un socket dans netstat cela ne signifie pas pour autant que la connexion réussira ; si le processus a échoué d'une manière qui le laisse interrompu mais toujours en cours d'exécution (bloqué dans une boucle infinie, bloqué par un débogueur, SIGSTOP ed, etc.), il ne répondra pas à une tentative de connexion réelle.