Bir Windows hizmetini bir komut dosyasından nasıl yeniden başlatırım?


38

Gibi görünen bir toplu komut dosyası var:

sc stop myservice
sc start myservice

hizmet durdurulana kadar sc beklemediği için hata veriyor. Bir hizmeti bir komut dosyasıyla nasıl yeniden başlatırım?


Ne hakkında bu ?
pQd

Yanıtlar:


47

Poster, yeniden başlatmayı denemeden önce servisin durdurulduğundan emin olmak istiyor. Böyle bir şey yaparak "sc query" çıktısında bir döngü kullanabilirsiniz:

: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

8
Ping, zaman gecikmesi olarak iyi kullanıyor.
David Yu

Teşekkürler, toplu halde uyku yok, bu yüzden beklemek için yapabileceğiniz tek şey :)
crb

4
+1 ve bir GOTO rozeti. Düz bir yüze sahip bir GOTO ifadesini kullananlara verilir.
Joseph Kern

Yalnızca parti destekli / döngüler destekliyse ... C # dilinde önemsizdir!
crb

3
Windows Server 2008'de bulunan hata seviyesi 0 olduğunda ve bulunmadığında 1'dir . Bu yüzden mantığı ters çevirmek zorunda kaldım ve sonra işe yaradı.
Kirk Woll

26

Bir şey eksik olabilir, ama bunu her zaman kullanırım:

net durdurma "myservice"
net çalıştırma "myservice"

veya daha kısa:

net stop "myservice" && net start "myservice"


24

Powershell ile ölü basit:

PS >Restart-Service MySrvcHere

Daha da iyisi, görünen adları kullanarak:

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

Get-Help Restart-Service daha fazlası için


6

Tamamen servisi yeniden başlatmak içinse,

Net stop myservice
Net start myservice

Bununla birlikte, sc seçeneklerine erişmek istiyorsanız, start / wait komutunu kullanabilirsiniz.

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

Bu teknik, herhangi bir komuta uygulanabilecek daha genel bir çözümdür.


sc stop myservicesadece stop komutunu gönderir ve servis durdurulmadan önce geri döner. Sc / b ile sc çağırmak işe yaramaz.
Jürgen Steinblock

5

Sahip olmak sessiz (örneğin, sunucu hizmeti gibi) durdurulması teyitleri sorar bazı hizmetin yeniden başlatma, Sen ekleyebilir / y durdurma komutunun sonuna.

net stop Server /y
net start Server

Otomatik komut dosyası yürütme için yararlı olacaktır.


3

Başarısız bir hizmeti yeniden başlatmak istiyorsanız, bir komut dosyası çalıştırmanıza gerek yoktur. Hizmetler MMC ek bileşeninde bir hizmeti sağ tıklatın, özellikleri seçin, kurtarma sekmesini tıklayın. Servisin durması durumunda hangi işlemlerin yapılacağını ayarlayabilirsiniz. Bir sürü esneklik var. Hizmeti durdurmaya çalışıyorsanız, bir şey yapıp ardından betiği başlatmalı, toplu iş dosyasını önceden başlatmalı net stop "myserviceshortname"ve bitmelinet start "myserviceshortname"

Vbscipt'de bir hizmeti durdurmak için biraz daha kod var ve 'bağımlıları:

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

İşte bir servisi başlatmak ve bağlı olduğu her şeyi yapmak (bu aşina olmalı)

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

Aşağıdaki komutları kullanabilirsiniz:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.