Команда Windows для получения статуса службы? - PullRequest
21 голосов
/ 29 апреля 2009

Мне нужно знать статус службы в конце моего пакетного сценария, который перезапускает службы, используя «net stop thingie» и «net start thingie».

В моем самом любимом идеальном мире я хотел бы отправить по электронной почте это состояние, чтобы читать холодными зимними ночами, чтобы успокоить себя теплом и комфортом сервера, который, как я знаю, работает правильно.

Просто чтобы вы знали, я использую платформу Windows Server 2003, и пакетный файл казался лучшим выбором. Я не возражаю против использования чего-то другого, и был бы очень открыт для предложений, но только ради знания (как зомби жаждет мозгов, я подумал, почему бы не надуть себя), есть команда, которая позволяет мне о статусе сервиса, в командной строке?

Стоит ли просто перенаправить вывод команды в файл?

Где, черт возьми, мои штаны? (Черт возьми, я действительно надеюсь, что юмор, вставленный в это, никого не оскорбит. Это утро среды, и юмор мне тоже нужен: P)

[Редактировать:] Решение, которое я использовал (больше не доступно) доступно для скачивания с --link redacted -

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

Ответы [ 12 ]

26 голосов
/ 29 апреля 2009

Вы пробовали sc.exe?

C:\> for /f "tokens=2*" %a in ('sc query audiosrv ^| findstr STATE') do echo %b
4  RUNNING

C:\> for /f "tokens=2*" %a in ('sc query sharedaccess ^| findstr STATE') do echo %b
1  STOPPED

Обратите внимание, что внутри пакетного файла вы удваиваете каждый знак процента.

19 голосов
/ 29 апреля 2009

Вы можете позвонить net start "service name" на свой сервис. Если он не запущен, он запустит его и вернет errorlevel = 0, если он уже запущен, он вернет errorlevel = 2.

12 голосов
/ 29 апреля 2009

Использование pstools - в частности psservice и "query" - например:

psservice query "serviceName"
10 голосов
/ 03 октября 2010

смотрите также здесь:

NET START | НАЙТИ "Сервисное имя"> nul IF errorlevel 1 ECHO Служба не работает

только что скопировано из: http://ss64.com/nt/sc.html

9 голосов
/ 29 апреля 2009

Если вам доступен PowerShell ...

Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name}

Даст вам ...

Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov

Вы можете заменить **** Сеть **** на конкретное название услуги, если вам нужно просто проверить одну услугу.

5 голосов
/ 29 апреля 2009

Использование Windows Script:

Set ComputerObj = GetObject("WinNT://MYCOMPUTER")    
ComputerObj.Filter = Array("Service")    
For Each Service in ComputerObj    
    WScript.Echo "Service display name = " & Service.DisplayName    
    WScript.Echo "Service account name = " & Service.ServiceAccountName    
    WScript.Echo "Service executable   = " & Service.Path    
    WScript.Echo "Current status       = " & Service.Status    
Next

Вы можете легко отфильтровать вышеперечисленное для конкретной услуги, которую вы хотите.

2 голосов
/ 11 июня 2011

Я хотел создать скрипт, который бы включал и выключал сервисы (в 1 скрипте)

net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error

...

очень помогло !! TYVM z666

но когда, например, служба отключена (также errorlevel = 2?), она переходит в «AlreadyRuning» и никогда не доходит до

if errorlevel 1 goto Error  ?!!

Я хотел вывод для этого случая ...

 :AlreadyRunning
 net stop NameOfSercive
 if errorlevel 1 goto Error


 :Error
 Echo ERROR!!1!
 Pause

мои 2 цента, надеюсь, это поможет

2 голосов
/ 08 февраля 2011

Ну, я вижу, как "Ник Кавадиас" говорит это:

"в соответствии с этим http://www.computerhope.com/nethlp.htm это должен быть NET START / LIST ..."

Если вы введете в Windows XP это:

NET START /LIST

вы получите сообщение об ошибке, просто введите вместо него

NET START

/ LIST предназначен только для Windows 2000 ... Если вы полностью прочитаете такую ​​сеть, вы увидите, что / LIST только для раздела Windows 2000.

Надеюсь, это поможет !!!

2 голосов
/ 08 февраля 2011

Может быть, это лучший способ запустить службу и проверить результат

Конечно, внутри пакета, подобного File.BAT, поместите что-то вроде этого примера, но просто замените «NameOfSercive» на имя нужной вам службы и замените строки REM собственным кодом:

@ECHO OFF

REM Put whatever your Batch may do before trying to start the service

net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error

REM Put Whatever you want in case Service was not running and start correctly

GOTO ContinueWithBatch

:AlreadyRunning
REM Put Whatever you want in case Service was already running
GOTO ContinueWithBatch

:Error
REM Put Whatever you want in case Service fail to start
GOTO ContinueWithBatch

:ContinueWithBatch

REM Put whatever else your Batch may do

Другая вещь - проверить его состояние, не изменяя его, для этого есть гораздо более простой способ сделать это, просто запустите:

net start

Как таковой, без параметров он покажет список всех запущенных сервисов ...

Так что простой grep или находка после него на трубе подойдут ...

Конечно, внутри пакета, подобного File.BAT, поместите что-то вроде этого примера, но просто замените «NameOfSercive» на имя нужной вам службы и замените строки REM собственным кодом:

@ECHO OFF

REM Put here any code to be run before check for Service

SET TemporalFile=TemporalFile.TXT
NET START | FIND /N "NameOfSercive" > %TemporalFile%
SET CountLines=0
FOR /F %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
IF 0==%CountLines% GOTO ServiceIsNotRunning

REM Put here any code to be run if Service Is Running

GOTO ContinueWithBatch

:ServiceIsNotRunning

REM Put here any code to be run if Service Is Not Running

GOTO ContinueWithBatch
:ContinueWithBatch
DEL -P %TemporalFile% 2>nul
SET TemporalFile=

REM Put here any code to be run after check for Service

Надеюсь, это поможет! Это то, что я обычно использую.

1 голос
/ 29 апреля 2009

Ну, я не уверен, можете ли вы отправить результаты по электронной почте из командного файла. Если я могу сделать альтернативное предложение, которое решит вашу проблему VBScript. Я не очень хорошо разбираюсь с vbscript, но вы можете использовать его для запроса сервисов, работающих на локальной машине. Сценарий, приведенный ниже, сообщит вам по электронной почте о состоянии всех служб, запущенных на компьютере, на котором запущен сценарий. Вы, очевидно, захотите заменить сервер SMTP и адрес электронной почты. Если вы являетесь частью домена и запускаете этот сценарий как привилегированный пользователь (они должны быть администратором на удаленной машине), вы также можете запрашивать удаленные машины, заменяя localhost на fqdn.

Dim objComputer, objMessage
Dim strEmail

' If there is an error getting the status of a service it will attempt to move on to the next one
On Error Resume Next

' Email Setup
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Service Status Report"
objMessage.From = "service_report@noreply.net"
objMessage.To = "youraddress@example.net"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.net"

'Server port (typically 25)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

Set objComputer = GetObject("WinNT://localhost")
objComputer.Filter = Array("Service")

For Each aService In objComputer
strEmail = strEmail &chr(10) & aService.Name & "=" & aService.Status
Next

objMessage.TextBody = strEmail
objMessage.Configuration.Fields.Update
objMessage.Send

Надеюсь, это поможет вам! Наслаждайтесь!

Редактировать: Ах, еще одна вещь, статус службы 4 означает, что служба запущена, статус службы 1 означает, что это не так. Я не уверен, что означает 2 или 3, но я готов поспорить, что они останавливаются / стартуют.

...