2016-03-07 221 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