pg_ctl 挂在 ssh 上

Pet*_*ier 6 restore virtualisation ssh postgresql-10

我正在设计一个过程来测试我的 postgresql 10.8 备份,方法是将它们恢复到一次性虚拟机中的随机时间点。不过,我一直无法完全自动化该过程。我在官方文档的第 8 步(第 25.3.4 节)被阻止

  1. 启动服务器。

执行pg_ctl startover ssh 时,命令会挂起,直到被杀死。如果我直接通过 ssh 连接到 VM 并执行pg_ctl start,则命令会按预期快速返回。

2012 年的这个帖子似乎描述了一个类似的场景。在我的情况,不过Postgres的过程即使当它是挂呼叫会话被杀死成功启动(可能是9.0.5和10.8之间虽然有所改善?)。

这个 github 问题似乎相关,但遗憾的是,通过用一种我不知道的语言进行了长时间的重写“解决了”,并最终得出结论,它是pg_ctl二进制文件中的一个错误。

大问题

如何自动执行第 8 步,以便我可以继续对备份媒体进行后续验证测试?

这是我需要破解的二进制文件中的一个突出错误吗?或者我错过了一个明智的实施?

mus*_*cio 8

看起来pg_ctl想要一个真正的输出终端,ssh当您简单地要求它运行命令时,它不会被分配。根据Postgres 手册

在类 Unix 系统上,默认情况下,服务器的标准输出和标准错误被发送到 pg_ctl 的标准输出(不是标准错误)。然后应该将 pg_ctl 的标准输出重定向到一个文件或通过管道传输到另一个进程,例如像 rotatelogs 这样的日志轮换程序;否则postgres会将其输出写入控制终端(从后台)并且不会离开 shell 的进程组。[...] 可以通过-l将服务器的输出附加到日志文件来更改这些默认行为。建议使用-l或 输出重定向。

因此,您可能需要告诉ssh分配一个终端pg_ctl使用的-t选项(ssh -t somehost "pg_ctl start")或者告诉pg_ctl写终端(ssh somehost "pg_ctl start >/dev/null"ssh somehost "pg_ctl start -l /tmp/start.log "