Bagaimana cara memulai kembali layanan Windows dari skrip?

38

Saya memiliki skrip batch yang terlihat seperti:

sc stop myservice
sc start myservice

kesalahan keluar karena sc tidak menunggu sampai layanan dihentikan. Bagaimana cara memulai kembali layanan dengan skrip?

Joshua
sumber
bagaimana dengan ini ?
pQd

Jawaban:

47

Poster ingin memastikan layanan dihentikan sebelum mencoba untuk memulainya kembali. Anda dapat menggunakan loop pada output "sc query" melakukan sesuatu seperti ini:

: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
sumber
8
Penggunaan ping yang bagus sebagai penundaan waktu.
David Yu
Terima kasih, tidak ada tidur dalam batch jadi itu semua dapat Anda lakukan untuk menunggu :)
crb
4
+1, dan lencana GOTO. Diberikan kepada mereka yang menggunakan pernyataan GOTO dengan wajah lurus.
Joseph Kern
Jika hanya batch yang didukung, lakukan / sementara loop ... Ini sepele dalam C #, sungguh!
crb
3
Di Windows Server 2008, tingkat kesalahan adalah 0 ketika ditemukan dan 1 ketika tidak ditemukan. Jadi saya harus membalikkan logika dan kemudian berhasil.
Kirk Woll
26

Mungkin melewatkan sesuatu, tetapi saya menggunakan ini sepanjang waktu:

berhenti bersih "layanan saya"
mulai bersih "layanan saya"

atau lebih pendek:

berhenti bersih "layanan saya" && mulai bersih "layanan saya"

Skawt
sumber
24

Mati sederhana dengan PowerShell:

PS >Restart-Service MySrvcHere

Lebih baik lagi, menggunakan nama tampilan:

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

Get-Help Restart-Service untuk lebih

Faktor Mystic
sumber
6

Jika ini murni untuk memulai kembali layanan, Anda dapat menggunakannya

Net stop myservice
Net start myservice

Namun, jika Anda ingin akses ke opsi sc, Anda dapat menggunakan perintah mulai / tunggu

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

teknik ini adalah solusi yang lebih umum yang dapat diterapkan pada perintah apa pun.

Peter Stuer
sumber
sc stop myservicehanya akan mengirim perintah berhenti dan kembali sebelum layanan dihentikan. Memanggil sc dengan start / b tidak akan membantu.
Jürgen Steinblock
5

Untuk memiliki tenang restart beberapa layanan, yang meminta konfirmasi harus dihentikan (layanan Server, misalnya), Anda bisa menambahkan / y ke akhir perintah berhenti.

net stop Server /y
net start Server

Akan sangat membantu untuk eksekusi skrip otomatis.

Fedir RYKHTIK
sumber
3

Jika Anda ingin memulai kembali layanan yang gagal, Anda tidak perlu menjalankan skrip. Di layanan MMC snapin klik kanan pada layanan, pilih properti, klik tab pemulihan. Di sini Anda dapat mengatur tindakan apa yang ingin Anda ambil jika layanan berhenti. Ada banyak fleksibilitas yang tersedia. Anda akan memerlukan skrip jika Anda mencoba menghentikan layanan, melakukan sesuatu kemudian mulai skrip, prakata file batch dengan net stop "myserviceshortname"dan diakhiri dengannet start "myserviceshortname"

Dalam vbscipt itu adalah kode yang lebih sedikit untuk menghentikan layanan dan tanggungannya:

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

Inilah yang memulai layanan dan apa pun itu tergantung (ini harus akrab)

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
Jim B
sumber
1

Anda dapat menggunakan perintah berikut:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Ganesh
sumber