Ik denk dat je beter moet definiëren wat je probeert te bereiken. Wil je gewoon weten of iets luistert op een bepaald punt? Als PostgreSQL luistert op een bepaalde poort? Als PostgreSQL actief is en daadwerkelijk verbindingen accepteert? Als u verbinding kunt maken met PostgreSQL, met succes kunt authenticeren en vragen kunt stellen?
Een optie is om psql
. aan te roepen om er verbinding mee te maken en de resultaatcode te controleren. Probeer de uitvoertekst niet te ontleden, want die is onderhevig aan vertaling in verschillende talen.
Gebruik de clientbibliotheek beter voor de taal van uw keuze - psycopg2
voor Python, PgJDBC voor Java, de Pg-edelsteen voor Ruby, DBD::Pg
voor Perl, nPgSQL voor C#, enz. Dit is de aanpak die ik zou aanraden. De SQLSTATE- of uitzonderingsdetails van een verbindingsfout zullen u meer vertellen over waarom de verbinding is mislukt - u kunt op deze manier het verschil zien tussen de server die niet luistert, authenticatiefout, enz. Bijvoorbeeld 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))
Er zijn uitzonderingsdetails in ex.pgcode
(de SQLSTATE
) om u meer te vertellen over fouten die aan de serverzijde worden gegenereerd, zoals verificatiefouten; het is leeg voor fouten aan de clientzijde.
Als je gewoon wilt zien of iets luistert op een bepaalde IP- en TCP-poort, kunt u netcat
. gebruiken (alleen *nix), of een eenvoudig script in de taal van uw keuze dat een socket maakt en een connect() doet en vervolgens de socket sluit als het een succesvol antwoord krijgt. Bijvoorbeeld het volgende triviale Python-script:
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))
Dezelfde aanpak is van toepassing in elke programmeertaal, alleen de details van de socketbibliotheek en foutafhandeling variëren.
Voor sommige doeleinden kan het ook handig zijn om de netstat
. te gebruiken tool om passief te vermelden welke processen op welke netwerksockets luisteren. De ingebouwde netstat
op Windows is behoorlijk hersendood, dus je moet de uitvoer meer ontleden dan met netstat
voor andere platforms, maar het zal nog steeds het werk doen. De aanwezigheid van een socket in netstat
betekent echter niet dat het zal lukken om er verbinding mee te maken; als het proces op de een of andere manier is mislukt waardoor het kapot is maar nog steeds actief is (vastgelopen in een oneindige lus, geblokkeerd door een debugger, SIGSTOP
ed, etc) dan zal het niet reageren op een daadwerkelijke verbindingspoging.