Python/PostgreSQL - 检查服务器是否正在运行

3

我刚刚开始使用psycopg2模块来访问本地PostgreSQL服务器,我想找到一种编程方式来检查服务器是否已经启动,以便在尝试启动服务器时我的程序可以处理错误:

psqldir = 'C:/Program Files/PostgreSQL/9.2/bin'    # Windows
username = os.environ.get('USERNAME')
dbname = 'mydb'
os.chdir(psqldir)
os.system('pg_ctl start -D C:/mydatadir')   # Error here if server already started
conn = psycopg2.connect('dbname=' + dbname + ' user=' + username)
cur = conn.cursor()

我做了一些实验,看起来这个返回值是"0"或"3",这将解决我的问题,但我没有找到任何PostgreSQL/psycopg2手册上确认这是否是一个已记录的行为:

server_state = os.system('pg_ctl status -D C:/mydatadir')

什么是最好的方法?谢谢!


2
使用subprocess模块而不是os.system。当然,获取命令的输出很容易...可以轻松解析输出结果中的相关字符串... - user2665694
1
@PrincessOftheUniverse subprocess肯定是正确的方式,但我强烈不同意你建议的另一部分。通常在输出中解析字符串是不明智的;ephedyn采用测试返回值的正确方法。当使用者的计算机配置为俄语、泰语或其他语言时,字符串解析将会出现问题,程序无法匹配。或者当有人在更新版本中修复拼写错误或修改措辞时,同样会导致问题。这是一个应该避免的糟糕做法,应该作为最后的手段。 - Craig Ringer
2个回答

5

来自pg_ctl文档:

-w

等待启动或关闭完成。等待是关闭的默认选项,但不是启动的。在等待启动时,pg_ctl会反复尝试连接服务器。在等待关闭时,pg_ctl会等待服务器删除其PID文件。pg_ctl基于启动或关闭的成功与否返回退出代码。

pg_ctl status也很有用:

status模式检查指定数据目录中是否运行着服务器。如果正在运行,则显示PID和用于调用它的命令行选项。如果服务器未运行,则该进程返回退出状态3。


非常符合我的需求,谢谢!还注意到你之前的评论中有一些其他有用的技巧 - 已适当点赞。 - elleciel

1
尝试使用pgrep命令。
proc = subprocess.Popen(["pgrep -u postgres -f -- -D"], stdout=subprocess.PIPE, shell=True)
    (out, err) = proc.communicate()
    try:
        if int(out) > 0:
            return True
    except Exception as e:
        return False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接