2013-03-05 2 views
2

Как я могу перезапустить службу Windows Service? Я знаю о Environment.Exit(1) в сочетании с настройками параметров параметров восстановления, но что, если служба действительно исправляет ошибки?Как я могу получить услугу для запроса перезагрузки?

фон:

У нас есть куча сервисов Windows, которые используют автономные компоненты как часть нашей архитектуры SOA. Мы хотим перезапустить службы при обновлении автономных компонентов, но мы не хотим ограничиваться двумя перезапусками (выпусками) в день, и мы не хотим, чтобы служба возобновлялась бесконечно, если есть настоящая ошибка.

ответ

1

Мы получили вокруг него сделать это:

using System.Diagnostics; 

Process.Start("cmd", "/c net stop \"Service1\" && net start \"Service1\""); 

Оказывается, что Process.Start() либо не создает дочерний процесс, или что дочерние процессы не убиты, когда родитель умирает.

Обратите внимание, что пользователь выполняет процесс, так как должен быть разрешен для запуска и остановки процесса.

2

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

Что я сделал в своем случае, которое было по общему признанию хакерским, но эффективным, заключалось в том, чтобы запустить специально созданный исполняемый файл под учетной записью, созданной во время установки службы. У учетной записи запрещены права входа в систему и контроль только за нашими конкретными службами (с использованием icacals или эквивалента разрешений на предоставление разрешения на предоставление услуг). Запускается исполняемый файл, который связывается со службой, используя ряд предопределенных OnCustomCommandservice commands, которые сообщают службе, что она была обновлена, что ей нужно закончить то, что она делает, и выключить, как только это возможно. Исполняемый файл ждет в течение заданного времени, и как только служба остановится, он перемещается по двоичным файлам и выполняет ряд других пользовательских шагов, затем запускает резервное копирование службы и завершает работу.

Я уверен, что есть более чистые способы сделать это, но после того, как я не смог найти что-нибудь более чистое после поиска нескольких часов, я решил, что это будет работать в нашем случае. У меня не было никаких проблем с этим в те годы, когда оно было на месте на большом количестве компьютеров, за исключением случайных проблем с разрешениями из-за того, что администраторы возились с учетной записью пользователя, которой работает исполняемый файл.

+0

Спасибо за ваш вклад. Очень полезно для сред, в которых требуется жесткое управление учетными записями пользователей. – sennett

Смежные вопросы