Как перезапустить службу Windows из скрипта?

38

У меня есть пакетный скрипт, который выглядит так:

sc stop myservice
sc start myservice

он выдает ошибку, потому что sc не ожидает остановки службы. Как перезапустить сервис с помощью скрипта?

Джошуа
источник
что насчет этого ?
PQD

Ответы:

47

Постер хочет убедиться, что служба остановлена, прежде чем пытаться перезапустить ее. Вы можете использовать цикл вывода «sc query», выполняя что-то вроде этого:

:stop
sc stop myservice

rem cause a ~10 second sleep before checking the service state
ping 127.0.0.1 -n 10 -w 1000 > nul

sc query myservice | find /I "STATE" | find "STOPPED"
if errorlevel 1 goto :stop
goto :start

:start
net start | find /i "My Service">nul && goto :start
sc start myservice
CRB
источник
9
Хорошее использование пинга в качестве задержки.
Дэвид Ю
Спасибо, в пакетном режиме нет сна, так что это все, что вы можете сделать, чтобы ждать :)
crb
4
+1 и значок GOTO. Присуждается тем, кто использует оператор GOTO с прямым лицом.
Джозеф Керн
Если только пакетная поддержка поддерживает циклы do / while ... Это действительно тривиально в C #!
CRB
3
В Windows Server 2008 уровень ошибки равен 0, если он найден, и 1, если он не найден. Поэтому мне пришлось инвертировать логику, и тогда это сработало.
Кирк Уолл
26

Может быть, чего-то не хватает, но я все это время использую:

нет стоп "myservice"
нет старт "myservice"

или короче:

нет остановки "myservice" && net start "myservice"

Skawt
источник
24

Умер просто с powershell:

PS >Restart-Service MySrvcHere

Еще лучше, используя отображаемые имена:

PS >Restart-Service -displayname "My Service Name Here"

Get-Help Restart-Service для большего

Фактор Мистик
источник
6

Если это чисто для перезапуска службы, вы можете использовать

Net stop myservice
Net start myservice

Однако, если вы хотите получить доступ к опциям sc, вы можете использовать команду start / wait

start /B /WAIT CMD /C "sc stop myservice"
start /B /WAIT CMD /C "sc start myservice"

эта техника является более общим решением, которое может быть применено к любой команде.

Питер Стуер
источник
sc stop myserviceпросто отправит команду останова и вернется до остановки службы. Вызов sc с помощью start / b не поможет.
Юрген Штейнблок
5

Чтобы выполнить тихий перезапуск какой-либо службы, которая запрашивает подтверждение об остановке (например, в качестве службы сервера), вы можете добавить / y в конец команды остановки.

net stop Server /y
net start Server

Это было бы полезно для автоматического выполнения скрипта.

Федир РЫХТИК
источник
3

Если вы хотите перезапустить отказавший сервис, вам не нужно запускать скрипт. В оснастке MMC сервисов щелкните правой кнопкой мыши сервис, выберите свойства, перейдите на вкладку восстановления. Здесь вы можете указать, какие действия вы хотите предпринять в случае остановки сервиса. Существует много гибкости. Вам понадобится сценарий, если вы пытаетесь остановить службу, что-то сделать, затем запустить сценарий, предварять командный файл net stop "myserviceshortname"и завершитьnet start "myserviceshortname"

В vbscipt немного больше кода для остановки службы и ее зависимых элементов:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='myservice'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Antecedent" )
For each objService in colServiceList
    objService.StopService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery _
        ("Select * from Win32_Service where Name='myservice'")
For each objService in colServiceList
    errReturn = objService.StopService()
Next

Вот запуск службы и все, от чего это зависит (это должно быть знакомо)

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name='Myservice'")
For each objService in colServiceList
    errReturn = objService.StartService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='myservice'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Dependent" )
For each objService in colServiceList
    objService.StartService()
Next
Джим Б
источник
1

Вы можете использовать следующие команды:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Ganesh
источник