Остановить и запустить сервис через пакетный или cmd файл? - PullRequest
273 голосов
/ 25 сентября 2008

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

Ответы [ 15 ]

334 голосов
/ 25 сентября 2008

Используйте команду 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
197 голосов
/ 25 сентября 2008
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 указывает на успех. Все, что выше, означает неудачу.

Как файл bat, 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

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

Команда NET не возвращает документированные коды возврата класса Win32_Service (служба неактивна, время ожидания запроса на обслуживание и т. Д.) И для многих ошибок просто возвращает уровень ошибки 2.

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

27 голосов
/ 25 сентября 2008

Вы можете использовать команду 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%

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

8 голосов
/ 07 декабря 2013

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

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  
7 голосов
/ 13 июня 2015

Я создал для этого свой личный пакетный файл, мой немного отличается, но вы можете изменить его по своему усмотрению. Я создал это некоторое время назад, потому что мне было скучно, и я хотел, чтобы люди могли просто ввести окончание, запуск, остановку или установку на авто. Этот 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
6 голосов
/ 25 сентября 2008

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

5 голосов
/ 29 января 2014

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

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

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

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

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

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
4 голосов
/ 10 февраля 2014

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

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

Но опять же ...

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

3 голосов
/ 27 января 2012

или вы можете запустить удаленный сервис с помощью этого cmd: sc \\<computer> start <service>

2 голосов
/ 24 мая 2016

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

Это может вызвать ошибку: остановка sc start

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

...