В настоящее время я использую следующий файл BAT для перезапуска удаленной службы:
sc \\MyServer stop MyRemoteService
sc \\MyServer start MyRemoteService
Это отлично работает для одного компьютера, но я хочу использовать его для перезапуска служб в ферме. Я мог бы просто перечислить все серверы в своем пакетном файле, но я хочу перезапустить службы, только если они уже запущены. Например, если служба работает на одном сервере в ферме, перезапустите ее, но если она еще не запущена, оставьте ее остановленной.
Есть ли способ сделать это удаленно? Я не женат на SC, есть другая программа, которая это делает.
Такой грязный ответ на вопрос меня развеселил :)
sc \\MyServer query MyRemoteService | find "RUNNING" && echo Service running - now stopping && sc \\MyServer stop MyRemoteService && ping 127.0.0.1 -n 10 && echo Now starting service && sc \\MyServer start MyRemoteService || echo Service not running
Это немного более подробный ответ, чем ответ Иззи, но допускает более длительный срок службы в состоянии «STOP_PENDING».
Предположим, что серверы находятся в текстовом файле, указанном в командной строке, в формате:
SERVERNAME1
SERVERNAME2
...
И сценарий:
@echo off
set SVC=ServiceName
if "%1"=="" goto end
for /f %%i in (%1) do call :do_bounce %%i
goto end
:do_bounce
rem Query for service running and bail if not
sc \\%1 query %SVC% | find "RUNNING"
if errorlevel 1 goto end
rem Stop the service and loop checking for it to stop
sc \\%1 stop %SVC%
:check_stopped
ping 127.0.0.1 -n 2 >NUL 2>NUL
sc \\%1 query %SVC% | find "STOPPED"
if errorlevel 1 goto check_stopped
rem Restart the service
sc \\%1 start %SVC%
:end
Powershell 2.0 имеет командлет Restart-Service
Вы можете захотеть проверить этот вопрос на StackOverflow.
В нем упоминается, почему вы можете захотеть провести мониторинг с каждой отдельной машины (с помощью инструмента мониторинга служб Windows), а не полагаться на сеть.