0

従来の Windows サービスのクラスターがあります。このサービスはすべて複数のサーバーにインストールされていますが、メモリ リーク、ファイル システムの例外、SQL 接続の例外など、何らかの理由でサービスがダウンしている可能性があります。そのため、サーバーをリモートにして、サービスのステータスを毎日確認する必要があります。復元アクションが追加されますが。しかし、それはまだ堅牢ではなく、制御可能ではありません。

私が見つけたい解決策は、これらの既存のサービスをすべて 1 つの Windows サービスに統合することです。このホスト サービスは、サブ サービスを実行し、それらをスケジュールして監視することができます。エラーが発生した場合、私のホスト サービスは、データベースを復元し、エラーをデータベースに記録し、関係者に電子メールを送信できます。このソリューションでは、 stop などのサービスを定期的にスケジュールすることもできます。したがって、サービスベースから継承してフレームワークに統合する既存のWindowsサービスのアセンブリを変更する必要がない方法があることを知りたいです。私は、OS がサブ サービスをホストできると考えました。私のホスト サービスまたはフレームワークもサブ サービスをホストし、それらもスケジュールできる方法が必要です。

私の最終的な目標は、Windows サービスが 1 つしかないことです。それが私のホスト サービスです。他のサブサービスは、OS にインストールせずに、私のサービスの下で実行されます。

以下に関連するスレッドをいくつか掘り下げましたが、それらは私の要件に適合しません。

4

2 に答える 2

0

だから、サービスベースから継承してフレームワークに統合する既存のWindowsサービスのアセンブリを変更する必要がない方法があることを知りたい

既存のコードを変更したくないように思われるので、最も単純で効果的な解決策は、他のサービスを監視する別のサービスを作成することだと思います。

ServiceControllerクラスには、sc別のユーティリティ呼び出しに頼ることなく、他のサービスのステータスをチェックするために必要なすべての機能が含まれています。

監視するサービスのリストを含む .txt ファイルまたは .xml ファイルを維持できます。

string[] servicesToWatch = GetServiceList();
foreach (string service in servicesToWatch)
{
    try
    {
        ServiceController sc = new ServiceController(service);
        if (sc.Status != ServiceStatus.Running)
        {
            sc.Start();
            sc.WaitForStatus(ServiceStatus.Running, TimeSpan.FromMinutes(2));
            // log to database that service was restarted
        }
    }
    catch (Exception e)
    {
        // log to database that service could not be started
        // send emails to necessary people
    }
}

次に、上記のコードをタイマーまたは x 分ごとにチェックする while ループに入れることができます。

于 2013-03-27T07:07:34.897 に答える
0

サービスと言うとき、適切なサービスまたはサービスに変換された実行可能ファイルを意味しますか? 後者の場合は、完全に制御できます。サブサービスをスレッドまたはプロセスとして生成することもできます。大きな問題は、プロセスを強制終了することです。Windows OS の新しいリリースごとに、プロセスの強制終了を困難にするセキュリティ機能がますます追加されています。

スレッドは、メモリ リークにより 1 つのスレッドが停止すると、プログラムに影響を与えるという点で問題になる場合があります。プログラム全体を強制終了して再起動する必要がある場合があります。

警告: サービスは「ローカル ユーザー」と呼ばれるユーザーとして実行されます。「ローカル ユーザー」としてログインすることはできません。最上位の管理者 (管理者と呼ばれます) としても、「ローカル ユーザー」のサービスやプロセスを強制終了することはできません。「ローカルユーザー」だけがそれらを殺すことができます。

firedaemon のようなシェアウェア製品を見たことがありますか? 彼らは似たようなことをします。

于 2013-03-27T06:23:12.760 に答える