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

274

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

  • 0
    Может быть, это немного не по теме (так как вы запрашиваете инструкции bat & cmd), но: PowerShell дает вам большой контроль и обратную связь для выполнения подобных действий.
Теги:
batch-file
cmd
command-line

15 ответов

338
Лучший ответ

Используйте команду 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 security descriptor.
        sdset-----------Sets a service 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
  • 7
    этот скриншот экрана только что выиграл приз! спасибо, я даже не знал о "sc" !!!
  • 1
    Я согласен, что это лучше, чем чистый старт / стоп. Обратите внимание, что на удаленных машинах также есть возможность касаться сервисов.
Показать ещё 3 комментария
181
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 (Service Not Active, Timeout Service Request Timeout и т.д.), а для многих ошибок просто возвращается Errorlevel 2.

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

  • 8
    Этот ответ - то, что мы должны видеть больше! Хорошо сделано.
  • 2
    Не все мои - коды возврата пришли от сообщества править ...
Показать ещё 3 комментария
27

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

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

  • 0
    Это работает для меня, спасибо @Jonas
8

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

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

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

Для этого я создал свой личный пакетный файл, мой немного отличается, но вы можете изменить его по своему усмотрению. Я создал это некоторое время назад, потому что мне было скучно, и я хотел, чтобы люди могли просто ввести окончание, запуск, остановку или установку на авто. Этот 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
  • 1
    Как правило, код только ответы не приветствуются. Не могли бы вы рассказать о своем решении или добавить пояснительные комментарии?
  • 2
    Я создал это некоторое время назад, потому что мне было скучно, и я хотел, чтобы люди могли просто ввести окончание, запуск, остановку или установку на авто. Этот BAT-файл просто запрашивает ввод имени службы, и он сделает все остальное за вас.
6

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

  • 1
    Связанная страница больше не существует. Таким образом, это больше комментарий сейчас.
5

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

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

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

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

Для ваших помощников по обслуживанию Ops... обязательно добавьте код причины и комментарий! то есть "4", которое равно "Запланировано" и комментирует "Остановка сервера для обслуживания"

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
  • 1
    Как мне это сделать, если мне нужно использовать другой идентификатор пользователя и пароль для входа в систему?
  • 1
    Вы запускаете CMD в качестве другого пользователя / ID, выполнив runas /user:Domain\UserName cmd затем введите свой пароль. CMD начнет работать как указанная учетная запись пользователя.
4

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

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

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

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

3

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

2

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

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

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

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

Вот команда Windows 10 для запуска восстановления системы с помощью пакета:

sc config swprv start= Auto

Вам также могут понравиться эти команды:

  • Измените значение реестра для автоматического запуска восстановления системы

    REG ДОБАВИТЬ "HKLM\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \Microsoft\Windows NT\CurrentVersion\SystemRestore"/v DisableSR/t REG_DWORD/d 0/f

  • Создать точку восстановления системы

    Wmic.exe/Пространство имен:\root\default Путь SystemRestore Вызов CreateRestorePoint "djibe спас ваш компьютер", 100, 12

  • Изменить использование диска восстановления системы

    vssadmin изменить размер shadowstorage/for = C: /on = C: /maxsize = 10%

наслаждаться

1

Иногда вы можете найти, что остановка не работает.

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

taskkill /pid [pid number] /f
1

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

0

Я пишу службу Windows на С#, цикл остановки/удаления/сборки/установки/запуска стал слишком утомительным. Написал мини-скрипт, назвал его reploy.bat и reploy.bat в мой выходной каталог Visual Studio (в котором есть исполняемый файл встроенной службы) для автоматизации цикла.

Просто установите эти 3 переменные

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

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

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%

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню