Zainstaluj usługę Windows z akcją odzyskiwania, aby uruchomić ponownie


88

Instaluję usługę systemu Windows przy użyciu klas ServiceProcessInstalleri ServiceInstaller.

Użyłem ServiceProcessInstallerdo ustawienia typu uruchomienia, nazwy itp. Ale jak ustawić akcję odzyskiwania na Uruchom ponownie?

Wiem, że mogę to zrobić ręcznie po zainstalowaniu usługi, przechodząc do konsoli zarządzania usługami i zmieniając ustawienia na karcie odzyskiwania we właściwościach usługi, ale czy istnieje sposób, aby to zrobić podczas instalacji?

Zakładka Service Property Recovery

Odpowiedzi:


99

Możesz ustawić opcje odzyskiwania za pomocą sc . Poniższe ustawienia spowodują ponowne uruchomienie usługi po awarii:

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

Można to łatwo wywołać z 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
Zauważ, że musisz podać nazwę usługi w cudzysłowie, jeśli zawiera spacje.
user626528

19
Jeśli zamierzasz wywołać to z programu obsługi instalacji usługi Installer [] w C # podczas instalacji usługi, możesz wstawić to wywołanie do modułu obsługi zdarzenia „Committed”, który wykona je zaraz po pojawieniu się usługi w Menedżerze sterowania usługami. Nie umieszczaj go w menedżerze zdarzeń „AfterInstall”, ponieważ nie zadziała to przy pierwszej instalacji usługi na komputerze.
Contango,

Analiza kodu @Kevin Visual Studio sugeruje, że obiekty nie powinny być usuwane więcej niż jeden raz, process.Close()linia jest bezużyteczna.
JohnTube

1
@ JohnTube - usunięto proces.Close () line
Kevin

23
Zauważ, że składnia może wydawać się niektórym dziwna, ale reset= 0jest poprawna i reset=0niepoprawna. Prawidłowe użycie spacji jest reset=zatem kluczowe, to jeden argument, po którym następuje spacja 0.
Liam

12

Po wielu próbach rozwiązałem to za pomocą aplikacji wiersza poleceń sc .

Mam plik wsadowy z installutil i sc. Mój plik wsadowy jest podobny do:

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

Jeśli chcesz uzyskać pełną dokumentację polecenia sc, kliknij to łącze: SC.exe: komunikuje się z kontrolerem usług i zainstalowanymi usługami

Uwaga: po każdym symbolu równości (=) należy dodać spację. Przykład: reset = 300



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.