Как проверить, запущен ли сервис через командный файл, и запустить его, если он не запущен? - PullRequest
81 голосов
/ 24 июля 2010

Я хочу написать пакетный файл, который выполняет следующие операции:

  • Проверьте, запущена ли служба
    • Если она запущена, выйдите из пакета
    • Если он не запущен, запустите службу

Образцы кода, которые я до сих пор гуглил, оказались не работающими, поэтому я решил не публиковать их.

Запуск службы выполняется с помощью:

net start "SERVICENAME"
  1. Как проверить, работает ли служба, и как сделать оператор if в пакетном файле?
  2. Я немного растерялся.Какой аргумент я должен передать на чистый старт?Название сервиса или его отображаемое имя?

Ответы [ 14 ]

148 голосов
/ 24 июля 2010

Чтобы проверить состояние услуги, используйте sc query <SERVICE_NAME>.Для блоков if в пакетных файлах проверьте документацию .

Следующий код проверит состояние службы MyServiceName и запустит ее, если она не работает (блок if будетвыполняется, если служба не запущена):

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   REM Put your code you want to execute here
   REM For example, the following line
   net start "MyServiceName"
  )
)

Объяснение того, что она делает:

  1. Запрашивает свойства службы.
  2. Ищет строкусодержащий текст «STATE»
  3. Маркирует эту строку и извлекает 3-й токен, который содержит состояние службы.
  4. Проверяет полученное состояние на соответствие строке «RUNNING»

Что касается вашего второго вопроса, аргумент, который вы хотите передать net start - это имя службы, не отображаемое имя.

29 голосов
/ 03 декабря 2010

Для переключения службы используйте следующее:

NET START «Координатор распределенных транзакций» || NET STOP «Координатор распределенных транзакций»

19 голосов
/ 24 июля 2010

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

sc query [ServiceName] | findstr /i "STATE"

Когда я запускаю его для своего NOD32 Antivirus, я получаю:

STATE                       : 4 RUNNING

Если бы это было остановлено, я бы получил:

STATE                       : 1 STOPPED

Вы можете использовать это в переменной, чтобы затем определить, используете ли вы NET START или нет.

Имя службы должно быть именем службы, а не отображаемым именем.

14 голосов
/ 24 июля 2010

Это должно сделать это:

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)
10 голосов
/ 18 августа 2014

Независимая от языка версия.

@Echo Off
Set ServiceName=Jenkins


SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
    echo %ServiceName% not running 
    echo Start %ServiceName%

    Net start "%ServiceName%">nul||(
        Echo "%ServiceName%" wont start 
        exit /b 1
    )
    echo "%ServiceName%" started
    exit /b 0
)||(
    echo "%ServiceName%" working
    exit /b 0
)
5 голосов
/ 10 апреля 2013

Я только что нашел эту ветку и хотел бы добавить к обсуждению, если человек не хочет использовать командный файл для перезапуска служб.В Windows есть опция, если вы идете в Сервисы, свойства сервиса, затем восстановление.Здесь вы можете установить параметры для услуги.Как перезапустить службу, если служба останавливается.Кроме того, вы можете даже сделать вторую неудачную попытку сделать что-то другое, как при перезагрузке компьютера.

4 голосов
/ 03 сентября 2012

Cuando se использует Windows en Español, el código debe quedar asi (при использовании Windows на испанском языке код есть):

for /F "tokens=3 delims=: " %%H in ('sc query MYSERVICE ^| findstr "        ESTADO"') do (
  if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here
    REM For example, the following line
    net start MYSERVICE
  )
)

Reemplazar MYSERVICE con no nombre del servicio que se sesea processar. Puedes ver el nombre del servicio viendo las propiedades del servicio. (Замените MYSERVICE на имя службы, которая будет обрабатываться. Вы можете увидеть название службы в свойствах службы.)

2 голосов
/ 02 ноября 2012
@echo off

color 1F


@sc query >%COMPUTERNAME%_START.TXT


find /I "AcPrfMgrSvc" %COMPUTERNAME%_START.TXT >nul

IF ERRORLEVEL 0 EXIT

IF ERRORLEVEL 1 NET START "AcPrfMgrSvc"
1 голос
/ 08 ноября 2017

Запуск службы с использованием скрипта Powershell. Вы можете связать это с планировщиком задач и запускать его с интервалами или по мере необходимости. Создайте его как файл PS1, т.е. файл с расширением PS1, а затем разрешите запуск этого файла из планировщика задач.

Для начала остановить службу

в планировщике задач, если вы используете его на сервере, используйте это в аргументах

-noprofile -executionpolicy bypass -file "C: \ Сценарии перезапуска службы \ StopService.PS1"

проверьте, запустив то же самое в cmd, если он работает, он должен работать и в планировщике задач

$Password = "Enter_Your_Password"
$UserAccount = "Enter_Your_AccountInfor"
$MachineName = "Enter_Your_Machine_Name"
$ServiceList = @("test.SocketService","test.WcfServices","testDesktopService","testService")
$PasswordSecure = $Password | ConvertTo-SecureString -AsPlainText -Force
$Credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $UserAccount, $PasswordSecure 

$LogStartTime = Get-Date -Format "MM-dd-yyyy hh:mm:ss tt"
$FileDateTimeStamp = Get-Date -Format "MM-dd-yyyy_hh"
$LogFileName = "C:\Users\krakhil\Desktop\Powershell\Logs\StartService_$FileDateTimeStamp.txt" 


#code to start the service

"`n####################################################################" > $LogFileName
"####################################################################" >> $LogFileName
"######################  STARTING SERVICE  ##########################" >> $LogFileName

for($i=0;$i -le 3; $i++)
{
"`n`n" >> $LogFileName
$ServiceName = $ServiceList[$i]
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName

Write-Output "`n####################################"
Write-Output "Starting Service - " $ServiceList[$i]

"$LogStartTime => Starting Service: $ServiceName" >> $LogFileName
Start-Service $ServiceList[$i]

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]}

if($ServiceState.Status -eq "Running")
{
"$LogStartTime => Started Service Successfully: $ServiceName" >> $LogFileName
Write-Host "`n Service " $ServiceList[$i] " Started Successfully"
}
else
{
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName
Write-Output "`n Service didn't Start. Current State is - "
Write-Host $ServiceState.Status
}
}

#code to stop the service

"`n####################################################################" > $LogFileName
"####################################################################" >> $LogFileName
"######################  STOPPING SERVICE  ##########################" >> $LogFileName

for($i=0;$i -le 3; $i++)
{
"`n`n" >> $LogFileName
$ServiceName = $ServiceList[$i]
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName

Write-Output "`n####################################"
Write-Output "Stopping Service - " $ServiceList[$i]

"$LogStartTime => Stopping Service: $ServiceName" >> $LogFileName
Stop-Service $ServiceList[$i]

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]}

if($ServiceState.Status -eq "Stopped")
{
"$LogStartTime => Stopped Service Successfully: $ServiceName" >> $LogFileName
Write-Host "`n Service " $ServiceList[$i] " Stopped Successfully"
}
else
{
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName
Write-Output "`nService didn't Stop. Current State is - "
Write-Host $ServiceState.Status
}
}
1 голос
/ 17 марта 2013

Я также хотел, чтобы электронное письмо было отправлено, если служба была запущена таким образом, поэтому добавил немного в код @Ic, просто подумав, что я опубликую его, если оно кому-нибудь поможет.Я использовал SendMail, но есть другие параметры командной строки Как отправить простое электронное письмо из пакетного файла Windows?

set service=MyServiceName

for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (

    net start %service%

    for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "        STATE"') do (
      if /I "%%H" EQ "RUNNING" (
        SendMail /smtpserver localhost /to me@mydomain.com /from watchdog@mydomain.com /subject Service Autostart Notification /body Autostart on service %service% succeded.
      ) else (
        SendMail /smtpserver localhost /to me@mydomain.com /from watchdog@mydomain.com /subject Service Autostart Notification /body Autostart on service %service% failed.
      )
    )

  )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...