2

Windows サービスに再起動を要求させるにはどうすればよいですか? Recovery Options サービスの設定と合わせて知っていEnvironment.Exit(1)ますが、サービスが本当にエラーになった場合はどうなりますか?

バックグラウンド:

SOA アーキテクチャの一部として自律型コンポーネントを使用する Windows サービスが多数あります。自律コンポーネントが更新されたときにサービスを再起動したいのですが、1 日 2 回の再起動 (リリース) に制限されたくありません。また、真のエラーが発生した場合にサービスが無期限に再起動されることも望ましくありません。

4

2 に答える 2

2

私は、この手法を使用する多数の自己更新サービスを作成しました。復旧オプションに依存することは理想的ではないことがわかりました。システム管理者は、サービスが自分のマシンで爆撃されていると感じることがよくあります (イベント ログに、予期しないサービスの停止によりサービスの復旧が行われていることを書き込みます)。

私の場合、明らかにハックですが効果的だったのは、サービスのインストール中に作成されたアカウントで、特別に細工された実行可能ファイルを起動することでした。アカウントはログオン権限を拒否され、特定のサービスのみを制御できます (icacals または同等のものを使用してサービス制御権限を付与します)。OnCustomCommand 実行可能ファイルが起動され、定義済みのサービス コマンドを使用してサービスと通信します。このコマンドは、サービスが更新されたこと、実行中の処理を終了する必要があること、およびできるだけ早くシャットダウンする必要があることをサービスに通知します。実行可能ファイルは一定時間待機し、サービスが停止すると、バイナリを移動し、他の多くのカスタム手順を実行してから、サービスのバックアップを開始して終了します。

これを行うためのよりクリーンな方法があると確信していますが、数時間探した後、よりクリーンなものを思い付くことができなかったので、これが私たちの場合にうまくいくと判断しました. 管理者が実行可能ファイルを実行するユーザーアカウントをいじることによる時折のアクセス許可の問題を除いて、多数のコンピューターに導入されてから何年もの間、これに関して問題はありませんでした。

于 2013-03-05T05:02:16.210 に答える
1

これを回避しました:

using System.Diagnostics;

Process.Start("cmd", "/c net stop \"Service1\" && net start \"Service1\"");

Process.Start()子プロセスを作成しないか、親が終了しても子プロセスが強制終了されないようです。

プロセスを実行するユーザーには、プロセスを開始および停止する権限が必要であることに注意してください。

于 2013-03-05T21:47:33.743 に答える