2016-04-25 74 views
2

在下面的例子中,我想延迟执行createuser命令,直到Postgres服务器启动并运行。Inno Setup - 等待Postgres数据库启动

if Exec('pg_ctl', 'start -D C:\ProgramData\PostgresQL\data', '', SW_SHOW, ewWaitUntilIdle, ResultCode) then 
begin 
    Sleep(10000); 
    // Create our database user 
    if Exec('createuser', '-w -d -R -S testdb', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) 

不幸的是使用任意Sleep()是我已经成功地实现这一目标的唯一途径。毫不奇怪,exWaitUntilIdle标志没有做到这一点,并延迟执行足够长的时间(如果有的话)。

因此,有没有人有更稳健的方式来确保createuser不会被执行,直到Postgres(pg_ctl start)服务器命令运行,空闲并准备好接受命令?

+0

为什么不使用'ewWaitUntilTerminated'? –

+0

Martin pg_ctl未终止。它启动一个服务器,必须保持运行,直到执行完所有后续命令。 – kh25

+0

'pg_ctl'在后台启动服务器,不是吗?根据文档:*服务器在后台启动,它的标准输入连接到/ dev/null(或者在Windows上是nul)*文档明确指出'pg_ctl'甚至不等待服务器启动默认。 –

回答

2

使用ewWaitUntilTerminated国旗-w switch

等待启动或者关闭的完成。等待是关机的默认选项,但不是初创公司。 ... pg_ctl根据启动或关闭的成功返回一个退出代码。

+0

似乎与-w开关一起使用。再次感谢。 – kh25