Установите службу Windows с действием восстановления для перезапуска

Я устанавливаю службу Windows, используя классы ServiceProcessInstaller и ServiceInstaller.

Я использовал ServiceProcessInstaller, чтобы установить тип запуска, имя и т. Д. Но как мне установить действие восстановления на перезапуск?

Я знаю, что могу сделать это вручную после установки службы, перейдя в консоль управления службами и изменив настройки на вкладке восстановления свойств службы, но есть ли способ сделать это во время установки?

Вкладка


person Ray    schedule 27.10.2009    source источник


Ответы (4)


Вы можете установить параметры восстановления с помощью 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();
}
person Kevin    schedule 29.07.2011
comment
Обратите внимание, что вам необходимо заключить имя службы в кавычки, если оно содержит пробелы. - person user626528; 29.05.2012
comment
Если вы собираетесь вызвать это из обработчика установки службы Installer [] в C # при установке службы, вы можете вставить этот вызов в обработчик событий Committed, который выполнит его сразу после того, как служба появится в диспетчере управления службами. Не помещайте его в диспетчер событий AfterInstall, так как он не будет работать в самый первый раз, когда служба будет установлена ​​на коробке. - person Contango; 10.03.2014
comment
Анализ кода @Kevin Visual Studio предполагает, что объекты не следует удалять более одного раза, строка process.Close() бесполезна. - person JohnTube; 13.03.2014
comment
@Contango, можешь объяснить дальше? - person JohnTube; 13.03.2014
comment
@ JohnTube - удалила строку process.Close () - person Kevin; 13.03.2014
comment
Обратите внимание, что синтаксис может показаться некоторым странным, но reset= 0 правильный, а reset=0 неправильный. Правильное использование пробелов имеет решающее значение, reset= - это один аргумент, за которым следует пробел, а затем 0. - person Liam; 08.04.2014
comment
60000 находится в мс (т. Е. 1 минута) и является полем Restart service after. - person Jesper Mygind; 21.09.2017
comment
Ошибка сценария sc [servicename] reset = 0 actions = restart / 60000 config для перезапуска службы как при 1-м, 2-м, так и при последующих сбоях. как его можно настроить только на первый вариант отказа? - person Nimrod; 30.11.2017
comment
@Liam Я попробовал actions= restart/6000 (с пробелом), и это не сработало, я проверил это в свойствах сервиса, но actions=restart/6000 сработал. Я не уверен насчет reset= и reset=, поскольку я не могу найти это значение ни в одном запросе или даже в пользовательском интерфейсе. Просьба уточнить. - person OldSchool; 10.03.2018
comment
Спасибо! Давно искал это .. :) - person Jeppe Spanggaard; 16.09.2019

После многих попыток я решил это с помощью приложения командной строки 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: взаимодействует с Service Controller и установленными службами

Примечание. После каждого символа равенства (=) необходимо добавить пробел. Пример: reset = 300

person Juan Carlos Velez    schedule 06.02.2012


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

person Ron Klein    schedule 02.07.2012
comment
Ваша ссылка не работает! Только ссылки - плохие ответы! - person AaA; 30.05.2017
comment
Ссылка работает и это лучшее решение. Работает без запуска процесса. - person Piedone; 22.11.2017