2009-04-29 3 views
21

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

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

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

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

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

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

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

ответ

5

Использование 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

Выбранный, потому что установка не требуется. Спасибо вам, ребята! –

12

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

psservice query "serviceName" 
+0

Это - мой любимый ^^ –

0

в соответствии с этим http://www.computerhope.com/nethlp.htm он должен быть NET START/LIST, но я не могу заставить его работать на XP. Я уверен, что есть WMI, который даст вам список.

26

Вы попробовали 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

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

+0

Не уверен, почему я получил нижний предел на этом, но так как он использует файл bat, чтобы запустить службу с помощью команды net start, и она встроена в команду, чтобы вернуть код ошибки, проще всего просто проверить код ошибки. Но если для этого требуется создать отдельный vbs вместо проверки возврата, мне все равно. – JRL

1

Ну, я не уверен, можете ли вы отправить результаты по электронной почте из командного файла. Если я могу сделать альтернативное предложение, которое решит вашу проблему 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 = "[email protected]" 
objMessage.To = "[email protected]" 
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 

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

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

+0

Спасибо за этот скрипт! Будем использовать его в моем пакетном файле в простой, но эффективной форме вызова оболочки на скрипт vb, который довольно легко обрабатывается сервером: P –

+0

Это в сочетании с другим сценарием, который я выбрал в качестве хорошего ответа , Я получил свой цикл остановки/перезагрузки/отправки почты прямо по делу. –

9

Если 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 

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

10

также смотри также:

NET START | FIND «имя службы»> NUL IF Равен 1 ECHO Служба не работает

копировали из: http://ss64.com/nt/sc.html

+0

+ для «NET START», не очевидный способ получить список запущенных сервисов – Fr0sT

2

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

Конечно изнутри Batch как 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 или найти после него на трубе будет соответствовать ...

конечно изнутри Batch как 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 

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

+0

Все эти материалы с временным файлом можно заменить на '(NET START | FIND« NameOfService »> nul) && SET ServiceRunning = 1' или' GOTO 'вместо установки флага. – Fr0sT

2

Ну я вижу "Ник Kavadias" говорил так:

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

Если вы наберете в Windows XP этом:

NET START /LIST 

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

NET START 

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

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

0

Ros код я отправляю также для зная, как много услуг работают ...

Представьте, что вы хотите знать, сколько услуги, как Oracle *, то вы кладете Oracle вместо NameOfSercive ... и вы получите количество услуг, таких как Oracle * работает на переменной% батончиков%, и если вы хотите сделать что-то, если есть только 4 вы можете сделать что-то вроде этого:

IF 4 ==% батончиков% GOTO FourServicesAreRunning

Это намного мощнее ... и ваш код не позволяет вам узнать, работает ли требуемый сервис ... если есть anot ее srecive начиная с таким же названием ... представьте себе: -ServiceOne -ServiceOnePersonal

Если вы ищете ServiceOne, но он только работает ServiceOnePersonal ваш код будет сказать ServiceOne работает ...

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

@ECHO OFF 
REM Put here any code to be run before check for Services 

SET TemporalFile=TemporalFile.TXT 
NET START > %TemporalFile% 
SET CountLines=0 
FOR /F "delims=" %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines 
SETLOCAL EnableDelayedExpansion 
SET CountLine=0 
FOR /F "delims=" %%X IN (%TemporalFile%) DO @(
SET /A CountLine=1+CountLine 

REM Do whatever you want to each line here, remember first and last are special not service names 

IF 1==!CountLine! (

    REM Do whatever you want with special first line, not a service. 

) ELSE IF %CountLines%==!CountLine! (

    REM Do whatever you want with special last line, not a service. 

) ELSE (

    REM Do whatever you want with rest lines, for each service. 
    REM For example echo its position number and name: 

    echo !CountLine! - %%X 

    REM Or filter by exact name (do not forget to not remove the three spaces at begining): 
    IF " NameOfService"=="%%X" (

    REM Do whatever you want with Service filtered. 

    ) 
) 

REM Do whatever more you want to all lines here, remember two first are special as last one 

) 

DEL -P %TemporalFile% 2>nul 
SET TemporalFile= 

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

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

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

2

мое намерение состояло в том, чтобы создать сценарий, который переключает услуги и выключаться (в 1 скрипте)

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

...

Помогал много !! TYVM z666

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

if errorlevel 1 goto Error ?!! 

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

my 2 Cents, надеюсь, это поможет

Смежные вопросы