我正在设计一个进程来测试postgresql 10.8备份,方法是将它们还原到一个丢弃虚拟机中的随机时间点。不过,我一直无法完全自动化这一过程。我在正式文件的第8步(第25.3.4节)被阻止
当在ssh上执行pg_ctl start时,命令会挂起,直到它被杀死。如果我直接将ssh放到VM上并执行pg_ctl start,那么该命令就会像预期的那样快速返回。
2012年这条线从年开始似乎描述了类似的场景。然而,在我的例子中,postgres进程确实成功地启动了,即使调用会话在挂起时被终止(可能是9.0.5到10.8之间的改进吗?)
这个github问题似乎是相关的,但不幸的是,用一种我不知道的语言进行了长时间重写,最终“解决了”,并得出结论,这是pg_ctl二进制文件中的一个bug。
如何使步骤8自动化,以便继续对备份媒体进行随后的验证测试?
在我需要破解的二进制文件中,这是一个出色的错误吗?还是我错过了一个合理的实施方案?
发布于 2019-07-17 15:38:02
看起来,pg_ctl需要一个真正的输出终端,当您只要求它运行一个命令时,它就不会由ssh分配。根据Postgres手册
在类似Unix的系统上,默认情况下,服务器的标准输出和标准错误被发送到pg_ctl的标准输出(而不是标准错误)。然后,应该将pg_ctl的标准输出重定向到文件或管道到另一个进程,如旋转日志程序,否则
postgres将将其输出写入控制终端(从后台),并且不会离开shell的进程组。...这些默认行为可以通过使用-l将服务器的输出附加到日志文件来更改。建议使用-l或输出重定向。
因此,您需要告诉ssh使用-t选项(ssh -t somehost "pg_ctl start")为pg_ctl分配终端,或者告诉pg_ctl不要写入终端(ssh somehost "pg_ctl start >/dev/null"或ssh somehost "pg_ctl start -l /tmp/start.log ")。
https://dba.stackexchange.com/questions/243075
复制相似问题