Остановить и запустить службу с помощью пакетного или cmd-файла?

StackOverflow https://stackoverflow.com/questions/133883

Вопрос

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

Это было полезно?

Решение

Используйте 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 мне кажется, это лучший метод.Попробуйте взглянуть на это: Коды возврата чистого старта.

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

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

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

Но с другой стороны...

Я вижу, что остановка первой службы занимает много времени, затем "чистая остановка" для последующей службы, похоже, просто ничего не делает.Посмотрите на службу в диспетчере служб, и ее состояние по-прежнему "Запущено" - никаких изменений в "Остановке".Тем не менее, я могу остановить эту вторую службу вручную, используя 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 и работает в обратном направлении.

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

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

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

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

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

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

taskkill /pid [pid number] /f

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

sc config swprv start= Auto

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

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

    REG ДОБАВИТЬ "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" /v DisableSR /t REG_DWORD /d 0 /f

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

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

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

    vssadmin изменяет размер shadowstorage /для=C:/вкл.=C:/максимальный размер = 10%

Наслаждайтесь

Я пишу службу Windows на C #, цикл остановки / удаления / сборки / установки / запуска стал слишком утомительным.Написал мини-сценарий, назвал его 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%

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top