我对 Arch 还很陌生,遇到了一个奇怪的问题。使用systemctl
我无法启动 postgresql。直接用 启动 postgresql 没pg_ctl
问题,甚至可以用 短暂启动systemctl
。
在 Arch Linux 上安装 + 初始化 postgresql 时创建的 systemd 单元文件包含以下 ExecStart 命令:
ExecStart= /usr/bin/pg_ctl -s -D ${PGROOT}/data start -w -t 120
查看单元文件后,我注意到失败时间和启动命令的超时之间存在关联。一旦我将-w
标志(等待操作完成)更改为标志-W
(不要等到操作完成),瞧!一切都运行正常,不再出现超时或服务启动失败的情况。
这很棒,我可以毫无问题地修改单元文件。我只是想知道这是否是其他配置出错的副作用,还是生成的单元文件不正确?
答案1
该-w
标志通过定期尝试连接到您的服务器来工作。当然,任何阻止连接到您的服务器的行为都会导致pg_ctl
认为您的服务器尚未启动。因此它会挂起,重试直到您指定的超时。当它超时时,它会将非零退出代码返回给systemd
,并且 systemd 会自动调用配置的ExecStop
命令,从而有效地停止您的服务器。
如果您在使用 手动启动服务器时能够连接到服务器pg_ctl
(即不仅仅是在 中看到它ps -ef
),那么某些环境变量可能不同(PGPORT
,PGDATA
)。
另一个可能导致这种情况的原因是尝试进行恢复或启动热备用服务器。在服务器完全准备就绪之前,它将接受 socker 连接,但会记录错误并拒绝任何查询。如果您在恢复结束时暂停或进行热备用,服务器将永远不会完全准备就绪。
pg_log
您的目录中可能有一些有用的信息PGDATA
。至少这些信息可以表明服务器是否看到但拒绝了来自的查询pg_ctl
。