Остановить и запустить службу через пакетный или cmd-файл?

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

14 ответов


использовать SC (service control) команда, это дает вам гораздо больше возможностей, чем просто 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

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.

при запуске из пакетного файла у вас есть доступ к уровню ошибок кода возврата. 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 (служба не активна,время ожидания запроса на обслуживание и т. д.), и для многих ошибок просто вернет Errorlevel 2.

смотрите сюда:http://ss64.com/nt/net_service.html


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

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


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

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

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

Я создал свой личный пакетный файл для этого, мой немного отличается, но не стесняйтесь изменять, как вы считаете нужным.

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

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


синтаксис всегда меня достает.... так...

здесь явно показано, как добавить строку в пакетный файл, который убьет удаленную службу (на другой машине), если вы являетесь администратором на обеих машинах, запустите .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

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

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

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

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


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


Я просто использовал пример Джонаса выше и создал полный список от 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 и работает в обратном направлении.


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

Это может привести к ошибке: стоп sc старт СК

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


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


иногда вы можете найти стоп-не работает..

мой SQlServer иногда делает это. С помощью следующей командной строки убивает его. Если вам действительно нужен ваш сценарий, чтобы убить вещи, которые не останавливаются. Я бы сделал это в крайнем случае

taskkill /pid [pid number] /f

Я пишу службу windows на C#, цикл stop/uninstall/build/install/start стал слишком утомительным. Написал мини скрипт, называется он reploy.bat и упал в мой выходной каталог Visual Studio (тот, который имеет встроенный исполняемый файл службы) для автоматизации цикла.

просто установите эти 3 vars

servicename : это отображается на панели управления Службы Windows (службы.msc)

slndir : папка (не полный путь), содержащая ваше решение (.ФСЛ) файл

binpath: полный путь (не путь к папке) к исполняемому файлу службы из сборки

Примечание: это должно быть запущено из командной строки разработчика Visual Studio для msbuild команда для работы.

SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

может быть, это поможет кому-то :)