3

私の要件は次のとおりです。

  1. アプリケーションが起動すると、PostgreSQLサービスがアプリケーションによって開始されます
  2. アプリケーションが閉じると、PostgreSQLサービスはアプリケーションによって閉じられます
  3. ... PostgreSQLのセットアップ、スクリプトの実行、サービスの開始などを担当します。

私が現在これをどのように行っているかは次のとおりです。

  1. 新しいプロセスでPostgreSQLを起動するRedirectStandardErrorRedirectStandardOutput、とがリダイレクトされます。これはサイレントスタートであり、ユーザーはコマンドウィンドウなどを表示できません。

問題は、

  • これをコーディングしたとき、私はメッセージ文字列を探し、英語のみをサポートしました。つまり、以前はで文字列を検索していsuccessましたが、現在は複数の言語RedirectStandardOutputをサポートしているため、比較に失敗します。

PostgreSQLのセットアップが正常に開始され、PostgreSQLサービスが実行されているかどうかを確認する方法はありますか?

別のプロセスでpg_ctl.exeを呼び出してPostgreSQLを起動しています。

4

5 に答える 5

4

(私たちは同様のことをしています)あなたはPostgresこのバッチファイルを使用してサービスにスターを付けます

"C:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exe"  -D "C:\Program Files\PostgreSQL\9.0\data" start

および[停止]サービスの場合

"C:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exe"  -D "C:\Program Files\PostgreSQL\9.0\data" stop

uが取得できるC:\Program Files\PostgreSQL\9.0\bin\pg_ctl.exeインストールの場所はどこですかPostgreSQl

    HKEY_LOCAL_MACHINE\SOFTWARE\PostgreSQL\Installations\postgresql-9.0

バッチファイルを実行してサービスが実際に実行されているかどうかを確認するときに、プロセス実行中のこのコードを使用して、実行されているかどうかを 確認postgres.exeできます。

また、1。checking-if-windows-application-is-running 2.how -can-i-know-if-a-process-is-running

  public bool IsProcessOpen(string name)
    {
 //here we're going to get a list of all running processes on
 //the computer
 foreach (Process clsProcess in Process.GetProcesses()) {
    //now we're going to see if any of the running processes
    //match the currently running processes. Be sure to not
    //add the .exe to the name you provide, i.e: NOTEPAD,
    //not NOTEPAD.EXE or false is always returned even if
    //notepad is running.
    //Remember, if you have the process running more than once, 
    //say IE open 4 times the loop thr way it is now will close all 4,
    //if you want it to just close the first one it finds
    //then add a return; after the Kill
    if (clsProcess.ProcessName.Contains(name))
    {
        //if the process is found to be running then we
        //return a true
        return true;
    }
}
//otherwise we return a false
return false;
}
于 2012-06-06T06:36:42.227 に答える
2

データベース接続を開始します。動作する場合は、PostgreSQL が実行されています。そうでない場合は、何か問題が発生しています。

于 2012-06-06T05:45:32.020 に答える
1

ユーザーには完全に見えないようにアプリケーションにバンドルするための組み込みデータベースとして PostgreSQL を使用しようとしています。

これだけではうまくいきません。PostgreSQL はそのように動作するようには設計されておらず、次のように表示されます。

  • postmaster は、他の何かの子プロセスではなく、pg_ctl によって生成されたサービスまたはデーモンとして実行されることを期待しています。親プロセスの終了後も存続するように設計されていますが、これは埋め込み時に必要なものではありません。

  • もちろん、PostgreSQL を実行可能ファイルに埋め込んだり、ライブラリとしてロードしたりする方法はありません。

  • postmaster には帯域外管理インターフェイスがありません。すべての管理は、SQL レベルの接続または構成ファイルとログを介して行われます。多分それは欠陥です。単純なプロセス間通信 (たとえば、Pg の共有メモリ) を使用して、TCP 接続とデータベース エンジンが動作しなくてもポストマスターの状態を照会する単純な管理 API があると便利です。現時点では、そのようなものは存在せず、PostgreSQL の意図した使用例では、それを作成する強い議論はありません。

  • Windows では、PostgreSQL は TCP/IP を介した通信のみをサポートします。そのためには、ホスト全体で一意のポートが必要です。プログラムの複数のインスタンスを同時に実行していて、それらを独立させたい場合、これはうまくいきません。

PostgreSQLは組み込みデータベースとして使用するように設計されていないため、やりたいことは可能ですが、面倒で難しいだけです。

ポストマスターとの共有メモリ メッセージ パッシングを使用してポストマスターに簡単なステータス レポートを要求できる、PostgreSQL 用の低レベルの診断/ステータス クライアントを実際に見てみたいと思います。インストールの問題を診断するのに最適です。特に、そこにあるすべての壊れた Windows マシンで問題があります。

pgsql-hackers チームと話し合い、コミットフェストにパッチを提出した後、必要な機能のプロトタイプを作成することを検討してみてはいかがでしょうか? PostgreSQL はオープン ソースであるため、実装する意思があれば、追加する必要のある機能を入手できる可能性があり、他の人にそれらを含める必要があることを納得させることができます。

于 2012-06-06T11:25:40.310 に答える
0

これをリンクすると役に立ちます。その前に、DB 接続を確認してください。または、IIS サーバーを開始/停止します (実行中の場合)。

于 2012-06-06T06:44:01.583 に答える
0

ServiceControllerクラスを使用してサービスを開始/停止します。

于 2012-06-06T06:03:23.937 に答える