Tôi nghĩ bạn cần xác định những gì bạn đang cố gắng đạt được tốt hơn. Bạn có chỉ muốn biết nếu bất cứ điều gì đang lắng nghe về một điểm nhất định? Nếu PostgreSQL đang nghe trên một cổng nhất định? Nếu PostgreSQL đang chạy và thực sự chấp nhận các kết nối? Nếu bạn có thể kết nối với PostgreSQL, xác thực thành công và đưa ra các truy vấn?
Một tùy chọn là gọi psql
để kết nối với nó và kiểm tra mã kết quả. Đừng cố gắng phân tích cú pháp văn bản đầu ra, vì văn bản đó có thể được dịch sang các ngôn ngữ khác nhau.
Tốt hơn, hãy sử dụng thư viện ứng dụng khách cho ngôn ngữ bạn chọn - psycopg2
cho Python, PgJDBC cho Java, Pg gem cho Ruby, DBD::Pg
cho Perl, nPgSQL cho C #, v.v. Đây là cách tiếp cận mà tôi muốn giới thiệu. SQLSTATE hoặc chi tiết ngoại lệ từ bất kỳ lỗi kết nối nào sẽ cho bạn biết thêm về lý do kết nối không thành công - bạn sẽ có thể phân biệt giữa máy chủ không nghe, lỗi xác thực, v.v. theo cách này. Ví dụ:trong Python:
import psycopg2
try:
conn = psycopg2.connect("host=localhost dbname=postgres")
conn.close()
except psycopg2.OperationalError as ex:
print("Connection failed: {0}".format(ex))
Có các chi tiết ngoại lệ trong ex.pgcode
(SQLSTATE
) để cho bạn biết thêm về các lỗi được tạo từ phía máy chủ, như lỗi xác thực; nó sẽ trống đối với các lỗi phía máy khách.
Nếu bạn chỉ muốn xem có điều gì đó đang nghe trên một cổng TCP và IP nhất định, bạn có thể sử dụng netcat
(* nix only) hoặc một tập lệnh đơn giản bằng ngôn ngữ bạn chọn để tạo một ổ cắm và thực hiện kết nối () sau đó đóng ổ cắm nếu nó nhận được phản hồi thành công. Ví dụ:tập lệnh Python tầm thường sau:
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))
Cách tiếp cận tương tự áp dụng cho bất kỳ ngôn ngữ lập trình nào, chỉ khác là chi tiết của thư viện socket và cách xử lý lỗi.
Đối với một số mục đích, nó cũng có thể hữu ích khi sử dụng netstat
công cụ để liệt kê thụ động quy trình nào đang lắng nghe trên ổ cắm mạng nào. netstat
tích hợp sẵn trên Windows thì khá tệ vì vậy bạn phải thực hiện nhiều phân tích cú pháp đầu ra hơn so với netstat
cho các nền tảng khác, nhưng nó vẫn sẽ hoạt động tốt. Sự hiện diện của một ổ cắm trong netstat
không có nghĩa là kết nối với nó sẽ thành công; nếu quá trình không thành công theo một cách nào đó khiến nó bị hỏng nhưng vẫn chạy (bị kẹt trong một vòng lặp vô hạn, bị trình gỡ lỗi chặn, SIGSTOP
ed, v.v.) thì nó sẽ không phản hồi với nỗ lực kết nối thực sự.