2016-04-25 6 views
2

Im folgenden Beispiel möchte ich die Ausführung des Befehls verzögern, bis der Postgres-Server betriebsbereit ist.Inno Setup - Warten auf den Start der Postgres-Datenbank

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) 

Leider eine beliebige Sleep() verwendet, ist der einzige Weg, ich habe es geschafft, dies zu erreichen. Die exWaitUntilIdle Flagge überrascht natürlich nicht und verzögert die Ausführung lange genug (wenn überhaupt).

So hat jemand eine robustere Möglichkeit sicherzustellen, dass die createuser nicht ausgeführt wird, bis der Serverbefehl Postgres (pg_ctl start) läuft, inaktiv und bereit Befehle zu akzeptieren?

+0

Warum verwenden Sie 'ewWaitUntilTerminated' nicht? –

+0

Martin pg_ctl wird nicht beendet. Es startet einen Server, der ausgeführt werden muss, bis alle nachfolgenden Befehle ausgeführt werden. – kh25

+0

Das 'pg_ctl' startet einen Server im Hintergrund, oder? Laut Dokumentation: * Der Server wird im Hintergrund gestartet, und seine Standardeingabe ist an/dev/null (oder unter Windows) angehängt. * Die Dokumentation besagt explizit, dass 'pg_ctl' nicht einmal auf den Start des Servers wartet standardmäßig. –

Antwort

2

Verwenden ewWaitUntilTerminated Flag mit -w switch:

Warten für den Start oder Abschalten abzuschließen. Warten ist die Standardoption für das Herunterfahren, aber nicht für das Starten. ... pg_ctl gibt basierend auf dem Erfolg des Startens oder Herunterfahrens einen Beendigungscode zurück.

+0

Scheint, mit dem Schalter -w zu arbeiten. Danke noch einmal. – kh25

Verwandte Themen