Myślę, że musisz zdefiniować, co chcesz osiągnąć lepiej. Czy chcesz tylko wiedzieć, czy coś słucha w pewnym momencie? Jeśli PostgreSQL nasłuchuje na danym porcie? Czy PostgreSQL działa i faktycznie akceptuje połączenia? Czy możesz połączyć się z PostgreSQL, pomyślnie uwierzytelnić się i wysyłać zapytania?
Jedną z opcji jest wywołanie psql
połączyć się z nim i sprawdzić kod wynikowy. Nie próbuj analizować tekstu wyjściowego, ponieważ podlega on tłumaczeniu na różne języki.
Lepiej użyj biblioteki klienta dla wybranego języka - psycopg2
dla Pythona, PgJDBC dla Javy, klejnot Pg dla Rubiego, DBD::Pg
dla Perla, nPgSQL dla C# itp. Jest to podejście, które polecam. Szczegóły SQLSTATE lub wyjątku z dowolnego błędu połączenia powiedzą Ci więcej o przyczynie niepowodzenia połączenia — w ten sposób będziesz w stanie odróżnić serwer, który nie nasłuchuje, awaria uwierzytelnienia itp. Na przykład w Pythonie:
import psycopg2
try:
conn = psycopg2.connect("host=localhost dbname=postgres")
conn.close()
except psycopg2.OperationalError as ex:
print("Connection failed: {0}".format(ex))
Istnieją szczegóły wyjątku w ex.pgcode
(SQLSTATE
), aby dowiedzieć się więcej o błędach generowanych po stronie serwera, takich jak błędy uwierzytelniania; będzie pusty w przypadku błędów po stronie klienta.
Jeśli chcesz tylko zobaczyć, czy coś nasłuchuje na podanym porcie IP i TCP, możesz użyć netcat
(tylko *nix) lub prosty skrypt w wybranym języku, który tworzy gniazdo i wykonuje funkcję connect(), a następnie zamyka gniazdo, jeśli otrzyma pomyślną odpowiedź. Na przykład następujący trywialny skrypt Pythona:
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))
To samo podejście ma zastosowanie w każdym języku programowania, różnią się tylko szczegóły biblioteki gniazd i obsługi błędów.
Do niektórych celów przydatne może być również użycie netstat
narzędzie do pasywnego wyświetlania, które procesy nasłuchują na których gniazdach sieciowych. Wbudowany netstat
w systemie Windows jest dość martwy, więc musisz zrobić więcej analizowania danych wyjściowych niż w przypadku netstat
dla innych platform, ale nadal będzie działać. Obecność gniazda w netstat
nie oznacza jednak, że połączenie się z nim powiedzie się; jeśli proces zawiódł w jakiś sposób, który pozostawia go uszkodzony, ale nadal działa (utknął w nieskończonej pętli, zablokowany przez debugger, SIGSTOP
ed, itp.), to nie zareaguje na faktyczną próbę połączenia.