2008-09-25 3 views
246

Как я могу запустить bat или cmd для остановки и надежного запуска службы с проверкой ошибок (или сообщить мне, что она по какой-то причине не была успешной)?Остановить и запустить службу через пакетный или cmd-файл?

+0

Возможно, несколько оффтопный (поскольку вы запрашиваете инструкцию bat & cmd), но: ** PowerShell ** дает вам много контроля и обратной связи для выполнения таких действий. – GvS 2008-09-25 15:19:55

ответ

309

Используйте команду SC (служба контроля), это дает вам гораздо больше возможностей, чем просто start & stop.

 
    DESCRIPTION: 
      SC is a command line program used for communicating with the 
      NT Service Controller and services. 
    USAGE: 
     sc <server> [command] [service name] ... 

     The option <server> has the form "\\ServerName" 
     Further help on commands can be obtained by typing: "sc [command]" 
     Commands: 
     query-----------Queries the status for a service, or 
         enumerates the status for types of services. 
     queryex---------Queries the extended status for a service, or 
         enumerates the status for types of services. 
     start-----------Starts a service. 
     pause-----------Sends a PAUSE control request to a service. 
     interrogate-----Sends an INTERROGATE control request to a service. 
     continue--------Sends a CONTINUE control request to a service. 
     stop------------Sends a STOP request to a service. 
     config----------Changes the configuration of a service (persistant). 
     description-----Changes the description of a service. 
     failure---------Changes the actions taken by a service upon failure. 
     qc--------------Queries the configuration information for a service. 
     qdescription----Queries the description for a service. 
     qfailure--------Queries the actions taken by a service upon failure. 
     delete----------Deletes a service (from the registry). 
     create----------Creates a service. (adds it to the registry). 
     control---------Sends a control to a service. 
     sdshow----------Displays a service's security descriptor. 
     sdset-----------Sets a service's security descriptor. 
     GetDisplayName--Gets the DisplayName for a service. 
     GetKeyName------Gets the ServiceKeyName for a service. 
     EnumDepend------Enumerates Service Dependencies. 

     The following commands don't require a service name: 
     sc <server> <command> <option> 
     boot------------(ok | bad) Indicates whether the last boot should 
         be saved as the last-known-good boot configuration 
     Lock------------Locks the Service Database 
     QueryLock-------Queries the LockStatus for the SCManager Database 
    EXAMPLE: 
      sc start MyService 
6

Использование кодов возврата от net start и net stop кажется лучшим методом для меня. Посмотрите на это: Net Start return codes.

+1

Связанная страница больше не существует. Таким образом, это скорее комментарий. – Neolisk 2016-11-08 20:41:22

172
net start [serviceName] 

и

net stop [serviceName] 

вам сказать, были ли они успешно или не очень четко. Например

U:\>net stop alerter 
The Alerter service is not started. 

More help is available by typing NET HELPMSG 3521. 

Если запущен из пакетного файла, у вас есть доступ к ERRORLEVEL обратного кода. 0 указывает на успех. Все выше указывает на отказ.

В файле летучей мыши, error.bat:

@echo off 
net stop alerter 
if ERRORLEVEL 1 goto error 
exit 
:error 
echo There was a problem 
pause 

Результат выглядит следующим образом:

U:\>error.bat 
The Alerter service is not started. 

More help is available by typing NET HELPMSG 3521. 

There was a problem 
Press any key to continue . . . 

Коды возврата

- 0 = Success 
- 1 = Not Supported 
- 2 = Access Denied 
- 3 = Dependent Services Running 
- 4 = Invalid Service Control 
- 5 = Service Cannot Accept Control 
- 6 = Service Not Active 
- 7 = Service Request Timeout 
- 8 = Unknown Failure 
- 9 = Path Not Found 
- 10 = Service Already Running 
- 11 = Service Database Locked 
- 12 = Service Dependency Deleted 
- 13 = Service Dependency Failure 
- 14 = Service Disabled 
- 15 = Service Logon Failure 
- 16 = Service Marked For Deletion 
- 17 = Service No Thread 
- 18 = Status Circular Dependency 
- 19 = Status Duplicate Name 
- 20 = Status Invalid Name 
- 21 = Status Invalid Parameter 
- 22 = Status Invalid Service Account 
- 23 = Status Service Exists 
- 24 = Service Already Paused 

Редактировать 20.04.2015

Коды возврата:

The NET command does not return the documented Win32_Service class return codes (Service Not Active,Service Request Timeout, etc) and for many errors will simply return Errorlevel 2.

Посмотрите здесь: http://ss64.com/nt/net_service.html

+8

Этот ответ - это то, что мы должны увидеть больше! Хорошая работа. – Pokus 2008-09-25 15:22:56

+2

Не все мои - коды возврата пришли из сообщества. Редактировать ... – 2008-09-25 18:49:51

+2

Ну, это хороший ответ все тот же. Огромное спасибо. – 2009-02-19 20:35:51

26

Вы можете использовать команду NET START, а затем проверить переменную ERRORLEVEL окружения, например,

net start [your service] 
if %errorlevel% == 2 echo Could not start service. 
if %errorlevel% == 0 echo Service started successfully. 
echo Errorlevel: %errorlevel% 

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

1

SC может сделать все, что с услугами ... запуск, остановка, проверка, настройка и многое другое ...

3

или вы можете запустить службу удаленного с этим ЦМД: sc \\<computer> start <service>

7

Вместо проверка кодов, это тоже работает

net start "Apache tomcat" || goto ExitError 

:End 
exit 0 

:ExitError 
echo An error has occurred while starting the tomcat services 
exit 1 
5

Синтаксис всегда получает меня .... так ...

Здесь явно указано, как добавить строку в пакетный файл, который приведет к удалению удаленного сервиса (на другом компьютере), если вы являетесь администратором на обеих машинах, запустите .bat как администратор, а машины находятся в том же домене ,Имя компьютера следует UNC-формате \ MYSERVER

sc \\ip.ip.ip.ip stop p4_1 

В этом случае ... p4_1 был как имя службы и отображаемое имя, при просмотре свойств для службы в Service Manager. Вы должны использовать имя службы.

Для вашей службы Умные наркотики ... обязательно добавьте свой код причины и комментарий! то есть «4», которая равна «Запланированные» и комментарий «Остановка сервера для обслуживания»

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance 
4

Мы хотели бы думать, что «чистая остановка» будет остановить службу. К сожалению, реальность не такая черно-белая. Если службе требуется много времени для остановки, команда вернется до остановки службы. Однако вы не будете знать, если не будете проверять уровень ошибок.

Решение, похоже, должно циклически искать состояние обслуживания до тех пор, пока оно не будет остановлено, с паузой каждый раз вокруг цикла.

Но затем снова ...

Я вижу первую службу занять много времени, чтобы остановить, то «чистая остановка» для последующего обслуживания только, кажется, не делать ничего. Посмотрите на сервис в диспетчере служб, и его состояние все еще «запущено» - никаких изменений в «Остановка». Тем не менее я могу остановить эту вторую услугу вручную, используя SCM, и она останавливается через 3 или 4 секунды.

5

Я создал свой личный пакетный файл для этого, мой немного отличается, но не стесняйтесь изменять, как вы сочтете нужным. Я создал это немного назад, потому что мне было скучно и хотелось сделать простой способ для людей, чтобы они могли вводить окончание, запуск, остановку или настройку на авто. Этот BAT-файл просто запрашивает, что вы вводите имя службы, и он сделает все остальное за вас. Я не понимал, что он искал что-то, что заявляло какую-либо ошибку, я, должно быть, неправильно понял эту часть. Хотя обычно это можно сделать, введя >> output.txt в конец строки.

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

Если я ошибаюсь, любой может поправить меня по этому поводу.

@echo off 
set /p c= Would you like to start a service [Y/N]? 
    if /I "%c%" EQU "Y" goto :1 
    if /I "%c%" EQU "N" goto :2 
    :1 
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]? 
    if /I "%c%" EQU "Y" goto :3 
    if /I "%c%" EQU "N" goto :4 
    :3 
    set /p var1= Service name: 
:4 
set /p c= Would you like to disable a service [Y/N]? 
    if /I "%c%" EQU "Y" goto :5 
    if /I "%c%" EQU "N" goto :6 
    :5 
    set /p var2= Service name: 
:6 
set /p c= Would you like to set a service to auto [Y/N]? 
    if /I "%c%" EQU "Y" goto :7 
    if /I "%c%" EQU "N" goto :10 
    :7 
    set /p var3= Service name: 
:10 
sc start %var% 
sc stop %var1% 
sc config %var2% start=disabled 
sc config %var3% start=auto 
2

Я просто использовал пример Йонаса выше и создал полный список из 0 до 24 уровней ошибок. Другое сообщение верно, что net start и net stop используют только errorlevel 0 для успеха и 2 для отказа.

Но это то, что работает для меня:

net stop postgresql-9.1 
if %errorlevel% == 2 echo Access Denied - Could not stop service 
if %errorlevel% == 0 echo Service stopped successfully 
echo Errorlevel: %errorlevel% 

stop Изменение в start и работает в обратном направлении.

1

Ручной перезапуск службы в порядке - service.msc имеет кнопку «Перезапустить», но в командной строке обе команды sc и net не имеют переключателя «перезагрузки», и если перезагрузка запланирована в файле cmd/bat, служба остановлена ​​и запущена сразу, иногда он получает сообщение об ошибке, потому что обслуживание еще не остановлено, ему нужно некоторое время, чтобы закрыть все.

Это может генерировать ошибку: подкожно остановить подкожно начать

Это хорошая идея, чтобы вставить тайм-аут, я использую пинг (это пингует каждую 1 секунду): подкожно остановки пинг локальный -n 60 sc start

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