2016-03-07 379 views
1

我一直在尝试学习如何使用make,并且遇到了一个我认为更多与流程管理无关的障碍。等待shell命令在makefile中执行

我有以下的目标

install: 
    ... 
    @brew install postgres 
    @pg_ctl -D data initdb 
    @pg_ctl -D data start 
    @createuser foo -s 

我安装的Postgres,创建数据库,启动它,然后创建一个用户。

在这种情况下,createuser继续失败,因为数据库尚未启动。

我假设需要发生的是,我需要使用wait阻止createuser命令,直到数据库启动,但在一小时的争吵后,我有一种感觉,我没有使用等待正确与类似

@pg_ctl -D data start & 
@wait $! 
@createuser ... 

任何想法我失踪?

+2

这不会有帮助 - 在后台运行,然后等待进程完成与在前台运行相同。问题是(可能)在数据库服务器实际准备好接收请求之前,'pg_ctl'进程返回。 –

+2

我认为问题是'@pg_ctl -D data start'返回一个退出代码,说明数据库已经启动,但数据库继续在后台启动。以前我在DB2上遇到过这个问题。在这种情况下,您需要等待几秒钟,然后尝试,如果失败,再等几秒钟,然后重试,直到您确定它太长。 –

+0

在这一点上,Make肯定不是正确的选择 –

回答

4

-w选项添加到您的pg_ctl ... start命令,以确保数据库之前完成启动的命令不会返回:

@pg_ctl -w -D data start 

man page(重点煤矿):

-w 等待启动或关机完成。 等待是关机的默认选项,但不是创业公司。当等待启动时​​,pg_ctl反复尝试连接到服务器。在等待关机时,pg_ctl等待服务器删除其PID文件。 pg_ctl根据启动或关闭的成功返回一个退出代码。


至于你的解决方案的尝试:

由于Oliver Charlesworth指出了关于这个问题的评论,既@pg_ctl -D data start@pg_ctl -D data start &随后@wait $!量为相同:(有效)同步执行CLI

的问题是,虽然CLI本身pg_ctl)的执行是同步,所述动作就引发不是;添加-w修复程序。

事后看来,你的问题与make无关。

+1

啊谢谢你。当我看到这个问题时,我感觉有某种东西闻起来像是一种竞争条件/异步排序。感谢您的挖掘 - 应该仔细阅读手册。 – sjhcockrell