Встановіть службу Windows із дією відновлення, щоб перезапустити


88

Я встановлюю службу Windows за допомогою класів ServiceProcessInstallerі ServiceInstaller.

Я використовував 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

19
Якщо ви збираєтеся зателефонувати до цього з обробника встановлення служби Installer [] в C #, коли служба інсталюється, ви можете вставити цей виклик у обробник події "Committed", який виконає його відразу після появи служби в диспетчері керування послугами. Не вкладайте його в менеджер подій "AfterInstall", оскільки це не спрацює з першого разу, коли служба буде встановлена ​​на коробці.
Contango

Аналіз коду @Kevin Visual Studio передбачає, що об’єкти не слід утилізувати більше одного разу, process.Close()рядок марний.
JohnTube

1
@ JohnTube - вилучив процес. Рядок Close ()
Кевін

23
Зверніть увагу, що синтаксис для деяких може виглядати дивним, але reset= 0є правильним і reset=0неправильним. Правильне використання пробілів має вирішальне значення, reset=є одним з аргументів, після чого пробіл 0.
Ліам

12

Після багатьох спроб я вирішив це за допомогою програми командного рядка sc .

У мене є командний файл з installlutil і 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: Зв'язок із контролером служби та встановленими службами

Примітка: Вам потрібно додати пробіл після кожного символу рівності (=). Приклад: скидання = 300



2

Я знайшов такий проект, який опікується цими налаштуваннями, використовуючи лише код та виклики Win API:
http://code.msdn.microsoft.com/windowsdesktop/CSWindowsServiceRecoveryPro-2147e7ac


Ваше посилання порушено! Відповіді лише на посилання погані!
AaA

Посилання працює, і це найкраще рішення. Працює без запуску процесу.
Piedone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.