Как служба Windows может программно перезапустить себя? - PullRequest
128 голосов
/ 21 октября 2008

Мне нужно написать надежный код в .NET, чтобы служба Windows (сервер 2003) могла перезапустить себя. Каков наилучший способ так это? Есть ли какой-нибудь .NET API для этого?

Ответы [ 18 ]

1 голос
/ 12 ноября 2010

Первый ответ на вопрос - самое простое решение: «Environment.Exit (1)». Я использую его в Windows Server 2008 R2, и он работает отлично. Служба останавливается, O / S ждет 1 минуту, затем перезапускает.

1 голос
/ 21 октября 2008

Я не думаю, что может. Когда служба «остановлена», она полностью выгружается.

Ну, ладно, я всегда думаю, что есть способ. Например, вы можете создать отдельный процесс, чтобы остановить службу, затем перезапустить ее и выйти.

0 голосов
/ 14 августа 2014

Создайте файл restart.bat, подобный этому

@echo on
set once="C:\Program Files\MyService\once.bat"
set taskname=Restart_MyService
set service=MyService
echo rem %time% >%once%
echo net stop %service% >>%once%
echo net start %service% >>%once%
echo del %once% >>%once%

schtasks /create /ru "System" /tn %taskname% /tr '%once%' /sc onstart /F /V1 /Z
schtasks /run /tn %taskname%

Затем удалите задачу% taskname%, когда ваш% service% запускается

0 голосов
/ 09 августа 2011

Просто прохожу: и думал, что добавлю дополнительную информацию ...

Вы также можете выдать исключение, это автоматически закроет службу Windows, и параметры автоматического перезапуска просто включаются. Единственная проблема с этим заключается в том, что если на вашем компьютере есть среда разработки, то JIT пытается нажмите, и вы получите подсказку отладки Y / N. скажи нет, и тогда он закроется, а затем перезапустится правильно. (на ПК без JIT все просто работает). причина, по которой я троллю, состоит в том, что этот JIT является новым для Win 7 (раньше он работал нормально с XP и т. д.), и я пытаюсь найти способ отключения JIT .... я могу попробовать упомянутый здесь способ Environment.Exit, посмотреть, как это тоже работает.

Кристиан: Бристоль, Великобритания

0 голосов
/ 11 июня 2009

Самый простой способ - создать командный файл с:

чистый стоп чистый старт

и добавьте файл в планировщик с желаемым интервалом времени

0 голосов
/ 21 октября 2008

Лучшим подходом может быть использование службы NT в качестве оболочки для вашего приложения. Когда служба NT запущена, ваше приложение может запускаться в режиме ожидания, ожидая запуска команды (или быть настроено на автоматический запуск).

Подумайте об автомобиле: когда он запускается, он начинает простаивать, ожидая, пока ваша команда пойдет вперед или назад. Это также дает другие преимущества, такие как улучшенное удаленное администрирование, так как вы можете выбрать способ представления своего приложения.

0 голосов
/ 19 октября 2016

NSSM довольно здорово. это все сделает за вас

0 голосов
/ 12 октября 2010
private static void  RestartService(string serviceName)
    {
        using (var controller = new ServiceController(serviceName))
        {
            controller.Stop();
            int counter = 0;
            while (controller.Status != ServiceControllerStatus.Stopped)
            {
                Thread.Sleep(100);
                controller.Refresh();
                counter++;
                if (counter > 1000)
                {
                    throw new System.TimeoutException(string.Format("Could not stop service: {0}", Constants.Series6Service.WindowsServiceName));
                }
            }

            controller.Start();
        }
    }
...