Перезапуск службы Windows

Я хочу запланировать автоматический перезапуск своих пользовательских служб с помощью пакетного файла с net stop, net start.

Когда работает net stop, прерывает ли он что-либо, что делается немедленно?

Просто интересно, что будет, если в середине обработки?

Малькольм


person Malcolm    schedule 09.03.2009    source источник
comment
Если ваши службы необходимо перезапустить, а не продолжать работать бесконечно, возможно, с ними что-то не так. Попробуйте решить эту проблему вместо того, чтобы постоянно перезапускать их.   -  person Rob Kennedy    schedule 09.03.2009


Ответы (5)


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

person Preet Sangha    schedule 09.03.2009

Это действительно зависит от того, как реализована услуга. «net stop» по сути звонит в службу и говорит: «не могли бы вы остановиться». Большинство служб будут выполнять эту команду и своевременно останавливаться. Однако есть плохие сервисы, которые не подчиняются и отказываются останавливаться. В этом случае нетто-стоп не будет предпринимать никаких дальнейших действий.

person JaredPar    schedule 09.03.2009

Это действительно зависит от сервиса. Я подозреваю, что большинство попытается войти в хорошее состояние, прежде чем остановиться. Это не убийство.

person i_am_jorf    schedule 09.03.2009

Служба регистрируется для получения событий (через RegisterServiceCtrlHandler). Когда вы выполняете чистую остановку, зарегистрированный обратный вызов получит обратный вызов с операцией SERVICE_CONTROL_STOP. Как служба отвечает на этот обратный вызов, зависит от реализации службы. Было бы целесообразно, чтобы служба выполняла обычную обработку завершения работы приложения.

person RedBlueThing    schedule 09.03.2009

Как и другие, когда вы вызываете net stop, он вызывает OnStop в службе Windows. Если OnStop не убивает все потоки в приложении или не останавливает все должным образом, ваша служба может не остановиться. (Я видел такое в одном из наших WCF-сервисов: мы не закрыли ServiceHost в OnStop, и, следовательно, приложение не остановилось бы по нашей команде — нам пришлось бы убивать процесс вручную.)

Один распространенный шаблон, который я видел, - это попытаться вызвать остановку службы, и если она не умирает в течение тайм-аута (10 секунд), принудительно завершить процесс. В качестве альтернативы пакетным файлам PowerShell имеет довольно хорошую поддержку для работы со службами.

person Andy White    schedule 09.03.2009
comment
Я предполагаю, что этот комментарий более специфичен для службы .NET - не уверен, как службы, отличные от .NET, останавливаются внутри... - person Andy White; 09.03.2009