再起動する回復アクションを備えたWindowsサービスをインストールします


88

ServiceProcessInstallerおよびServiceInstallerクラスを使用してWindowsサービスをインストールしています。

を使用しServiceProcessInstallerて開始タイプ、名前などを設定しましたが、回復アクションを再起動に設定するにはどうすればよいですか?

サービスのインストール後に、サービス管理コンソールに移動し、サービスのプロパティの[リカバリ]タブの設定を変更することで手動で実行できることはわかっていますが、インストール中に実行する方法はありますか?

[サービスプロパティの回復]タブ

回答:


99

scを使用してリカバリオプションを設定できます。以下は、障害後にサービスを再起動するように設定します。

sc failure [servicename] reset= 0 actions= restart/60000

これはC#から簡単に呼び出すことができます:

static void SetRecoveryOptions(string serviceName)
{
    int exitCode;
    using (var process = new Process())
    {
        var startInfo = process.StartInfo;
        startInfo.FileName = "sc";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        // tell Windows that the service should restart if it fails
        startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

        process.Start();
        process.WaitForExit();

        exitCode = process.ExitCode;
    }

    if (exitCode != 0)
        throw new InvalidOperationException();
}

4
スペースが含まれている場合は、サービス名を引用符で囲む必要があることに注意してください。
user626528 2012年

19
サービスのインストール時にC#のInstaller []サービスインストールハンドラーからこれを呼び出す場合は、この呼び出しを「コミット済み」イベントハンドラーに挿入して、サービスがサービスコントロールマネージャーに表示された直後に実行できます。「AfterInstall」イベントマネージャーには入れないでください。これは、サービスがボックスに初めてインストールされたときに機能しません。
コンタンゴ2014年

@Kevin Visual Studioのコード分析では、オブジェクトを複数回破棄しないでくださいprocess.Close()。行は役に立ちません。
JohnTube 2014年

1
@ JohnTube--process.Close()行を削除
Kevin

23
構文は一部の人にreset= 0は奇妙に見えるかもしれませんが、正しく、reset=0正しくないことに注意してください。スペースの正しい使用は非常に重要でreset=あり、1つの引数、スペース、そして0
リアム

12

何度も試みた後、scコマンドラインアプリを使用して解決しました。

installutilとscを含むバッチファイルがあります。私のバッチファイルは次のようなものです。

installutil.exe "path to your service.exe"
sc failure "your service name" reset= 300 command= "some exe file to execute" actions= restart/20000/run/1000/reboot/1000

scコマンドの完全なドキュメントが必要な場合は、次のリンクをたどってください。SC.exe:サービスコントローラーおよびインストールされているサービスと通信します。

注:各等号(=)記号の後にスペースを追加する必要があります。例:reset = 300



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.