Команда Windows для получения статуса службы?
Мне нужно знать статус службы в конце моей партии script, которая перезапускает службы, используя "net stop thingie" и "net start thingie".
В моем самом любимом идеальном мире я хотел бы послать по электронной почте государству себе, читать холодные зимние ночи, чтобы успокоить себя с теплом и комфортом сервера, который, как я знаю, работает правильно.
Просто для того, чтобы вы знали, я использую платформу Windows Server 2003, и пакетный файл казался лучшим выбором. Я не против использовать что-то еще, и буду очень открыт для предложений, но только ради знания (как зомби жаждут мозгов, я думал, почему бы не раздуть свои собственные), есть ли команда, которая позволяет мне проверять о статусе службы в командной строке?
Должен ли я просто перенаправить вывод команды в файл?
Где, черт возьми, мои штаны? (Боже, я действительно надеюсь, что юмор, вставленный в это, никого не оскорбит. В это утро в среду и юмор мне тоже нужно: P)
[Изменить:] Решение, которое я использовал (больше не доступно) для загрузки из -link redacted -
Он используется как набор задач, который должен выполняться в ночное время, и проверять мое электронное письмо утром, я вижу, правильно ли перезагрузился сервис.
Ответы
Ответ 1
Использование 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
Вы пробовали 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
Обратите внимание, что внутри пакетного файла вы должны удвоить каждый знак процента.
Ответ 3
Вы можете позвонить net start "service name"
в свою службу. Если он не запущен, он запустит его и вернет errorlevel = 0, если он уже запущен, он вернет errorlevel = 2.
Ответ 4
Использование pstools - в частности psservice и "query" - например:
psservice query "serviceName"
Ответ 5
посмотрите также:
NET START | НАЙТИ "Имя службы" > nul IF errorlevel 1 ECHO Служба не работает
просто скопирован из:
http://ss64.com/nt/sc.html
Ответ 6
Если 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 **** на конкретное имя службы, если вам просто нужно проверить одну услугу.
Ответ 7
Возможно, это может быть лучший способ запустить службу и проверить результат
Конечно, изнутри Пакета, такого как 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
Надеюсь, это поможет! Это то, что я обычно использую.
Ответ 8
Ну, я вижу "Ника Кавадиаса", говоря это:
"в соответствии с этим http://www.computerhope.com/nethlp.htm он должен быть NET START/LIST..."
Если вы ввели в Windows XP это:
NET START /LIST
вы получите сообщение об ошибке, просто введите вместо этого
NET START
The/LIST предназначен только для Windows 2000... Если вы полностью прочитали такой веб-сайт, вы увидите, что /LIST находится только в разделе Windows 2000.
Надеюсь, это поможет!!!
Ответ 9
мое намерение состояло в создании script, который включает и выключает службы (в 1 script)
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
my 2 Cents, надеюсь, что это поможет
Ответ 10
Ну, я не уверен, можете ли вы отправить по электронной почте результаты этого из пакетного файла. Если я могу сделать альтернативное предложение, которое решит вашу проблему vbscript. Я очень далек от vbscript, но вы можете использовать его для запроса служб, запущенных на локальной машине. script ниже отправит вам по электронной почте статус всех служб, запущенных на компьютере, на котором запущен script. Очевидно, вы захотите заменить SMTP-сервер и адрес электронной почты. Если вы являетесь частью домена и запускаете этот script как привилегированный пользователь (он должен быть администратором на удаленном компьютере), вы также можете запросить удаленные компьютеры, заменив 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, но я готов поспорить, что они останавливаются/начинаются.
Ответ 11
в соответствии с этим http://www.computerhope.com/nethlp.htm он должен быть NET START/LIST, но я не могу заставить его работать на XP. Я уверен, что есть WMI, который предоставит вам список.
Ответ 12
Ros код я post также предназначен для того, чтобы узнать, сколько сервисов запущено...
Представьте, что вы хотите знать, сколько сервисов похоже на Oracle *, тогда вы ставите Oracle вместо NameOfSercive... и вы получаете количество сервисов, таких как Oracle *, работающих на переменной% CountLines%, и если вы хотите что-то сделать, если есть только 4, вы можете сделать что-то вроде этого:
IF 4 ==% CountLines% GOTO FourServicesAreRunning
Это намного мощнее... и ваш код не позволяет вам узнать, работает ли требуемая служба... если есть еще одна 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
Конечно, это только список запущенных сервисов, я не знаю, как сеть может перечислить неработающие службы...
Надеюсь, это поможет!!!