Установите службу 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», который выполнит его сразу после появления службы в Service Control Manager. Не помещайте его в диспетчер событий «AfterInstall», так как он не будет работать в самый первый раз, когда служба будет установлена ​​на коробке.
Contango

Анализ кода @Kevin Visual Studio предполагает, что объекты не должны удаляться более одного раза, process.Close()строка бесполезна.
JohnTube

1
@ JohnTube - удалена строка process.Close ()
Кевин

23
Обратите внимание, что синтаксис может показаться некоторым странным, но reset= 0он правильный и reset=0неправильный. Правильное использование пробелов имеет решающее значение, reset=это один аргумент, за которым следует пробел 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



2

Я нашел следующий проект, который заботится об этих настройках, используя только код и вызовы Win API:
http://code.msdn.microsoft.com/windowsdesktop/CSWindowsServiceRecoveryPro-2147e7ac


Ваша ссылка не работает! Ссылка только ответы плохие!
AaA

Ссылка работает и это лучшее решение. Работает без запуска процесса.
Piedone
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.