Installieren Sie den Windows-Dienst mit der Wiederherstellungsaktion zum Neustart

87

Ich installiere einen Windows-Dienst mit den Klassen ServiceProcessInstallerund ServiceInstaller.

Ich habe den verwendet ServiceProcessInstaller, um den Starttyp, den Namen usw. festzulegen. Aber wie setze ich die Wiederherstellungsaktion auf Neustart?

Ich weiß, dass ich dies nach der Installation des Dienstes manuell tun kann, indem ich zur Dienstverwaltungskonsole gehe und die Einstellungen auf der Registerkarte "Wiederherstellung" der Eigenschaften des Dienstes ändere. Gibt es jedoch eine Möglichkeit, dies während der Installation zu tun?

Registerkarte "Wiederherstellung von Serviceeigenschaften"

Strahl
quelle

Antworten:

97

Sie können die Wiederherstellungsoptionen mit sc festlegen . Im Folgenden wird festgelegt, dass der Dienst nach einem Fehler neu gestartet wird:

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

Dies kann leicht von C # aufgerufen werden:

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();
}
Kevin
quelle
4
Beachten Sie, dass Sie den Dienstnamen in Anführungszeichen setzen müssen, wenn er Leerzeichen enthält.
user626528
18
Wenn Sie dies bei der Installation des Dienstes vom Installer [] -Dienstinstallationshandler in C # aufrufen, können Sie diesen Aufruf in den Ereignishandler "Festgeschrieben" einfügen, der ihn unmittelbar nach dem Anzeigen des Dienstes in Service Control Manager ausführt. Legen Sie es nicht in den Ereignismanager "AfterInstall", da dies nicht funktioniert, wenn der Dienst zum ersten Mal auf der Box installiert wird.
Contango
Die Code-Analyse von @ Kevin Visual Studio legt nahe, dass Objekte nicht mehr als einmal entsorgt werden sollten. Die process.Close()Zeile ist nutzlos.
JohnTube
1
@ JohnTube - entfernte den Prozess.Close () Zeile
Kevin
22
Beachten Sie, dass die Syntax für manche seltsam aussieht, aber reset= 0korrekt und reset=0falsch ist. Die richtige Verwendung von Leerzeichen ist entscheidend, reset=ist ein Argument, gefolgt von einem Leerzeichen 0.
Liam
12

Nach vielen Versuchen habe ich es mit der sc Kommandozeilen-App gelöst .

Ich habe Batch-Datei mit installutil und sc. Meine Batch-Datei ähnelt:

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

Wenn Sie die vollständige Dokumentation des Befehls sc wünschen, folgen Sie diesem Link: SC.exe: Kommuniziert mit dem Service Controller und den installierten Diensten

Hinweis: Sie müssen nach jedem Gleichheitszeichen (=) ein Leerzeichen einfügen. Beispiel: reset = 300

Juan Carlos Velez
quelle