Зупинити та запустити послугу через пакетний чи cmd-файл?


288

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


Можливо, дещо офтопік (оскільки ви просите інструкцію щодо bat & cmd), але: PowerShell дає вам багато контролю та відгуків для виконання подібних дій.
GvS

Відповіді:


347

Використовуйте команду SC(контроль управління), вона дає вам набагато більше варіантів, ніж просто start& stop.

  ОПИС:
          SC - програма командного рядка, яка використовується для спілкування з
          Контролер та послуги NT.
  ВИКОРИСТАННЯ:
      sc <server> [команда] [назва послуги] ...

      Параметр <server> має форму "\\ ServerName"
      Подальшу допомогу щодо команд можна отримати, ввівши: "sc [команда]"
      Команди:
        запит ----------- запитує стан для послуги, або
                        перераховує статус для видів послуг.
        queryex --------- Запитує розширений стан для послуги, або
                        перераховує статус для видів послуг.
        start ----------- Запускає послугу.
        пауза ----------- Надсилає запит на управління PAUSE до служби.
        допитувати ----- Надсилає запит управління INTERROGATE до служби.
        продовжувати -------- Надсилає неперервний запит на контроль до служби.
        стоп ------------ Надсилає запит STOP на сервіс.
        config ---------- Змінює конфігурацію послуги (постійний).
        Опис ----- Змінює опис послуги.
        пошкодження --------- Змінює дії, зроблені службою при відмові.
        qc -------------- Запитує інформацію про конфігурацію послуги.
        qdescription ---- Запитує опис послуги.
        qfailure -------- Запитує дії, зроблені службою при відмові.
        delete ---------- Видаляє службу (з реєстру).
        create ---------- Створює послугу. (додає його до реєстру).
        control --------- Надсилає керування службі.
        sdshow ---------- Відображає дескриптор безпеки служби.
        sdset ----------- Встановлює дескриптор безпеки служби.
        GetDisplayName - отримує DisplayName для послуги.
        GetKeyName ------ Отримує ServiceKeyName за послугу.
        EnumDepend ------ Перераховує залежність від обслуговування.

      Наступні команди не потребують назви служби:
      sc <сервер> <команда> <опція>
        boot ------------ (нормально | погано) Позначає, чи повинен останній завантажувач
                        буде збережено як останню відому гарну конфігурацію завантаження
        Блокування ------------ Блокування сервісної бази даних
        QueryLock ------- запитує LockStatus для бази даних SCManager
  ПРИКЛАД:
          sc запуску MyService

1
Я згоден, що це краще, ніж чистий старт / стоп. Зауважте, що є можливість торкнутися послуг також на віддалених машинах.
Програміст поза законом,

1
Чудова відповідь. Але вам потрібно бути адміністратором, щоб запустити службу запуску SC. Я знайшов рішення , що тут (Прийнятий відповідь містить рішення).
Michael K.

56
Проблема з SC полягає в тому, що команда повертається негайно, а не після завершення дії. Якщо ви хочете перезапустити послугу за допомогою пакетного файлу (зупинити, то запустити), зупинка повертається негайно, а потім запускається, оскільки служба не припиняється. Чиста зупинка / старт повертається після завершення дії, тому не має цієї проблеми.
Дом

Я відкрив cmd як режим адміністратора, отримуючи помилку Синтаксис цієї команди: Сервіс NET STOP
Satish Singh

чи є спосіб перевірити, чи сервіс припинено належним чином ?? у 2020 році?
Anand Varkey Philips

212
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 (Сервіс неактивний, Час очікування послуги та ін.), А для багатьох помилок просто поверне Errorlevel 2.

Подивіться тут: http://ss64.com/nt/net_service.html


1
NET НЕ тільки для виконання функцій , пов'язаних послуг , в той час як SC це тільки для виконання функцій , пов'язаних послуг.
Wernight

3
Ця відповідь є кращою, оскільки команда "net" блоків команд і чекає запуску або зупинки послуги до того, як пакетний сценарій продовжить виконання.
Стівен

Оскільки (як каже редагування) більшість errorlevelповернених разів 2, дивіться тут, як інтерпретувати результат помилки .
HeyJude

28

Ви можете скористатися командою 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

Замість перевірки кодів це також працює

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-файл просто вимагає ввести ім’я послуги, і все це зробить за вас.
Nathanial Wilson

6

Використання зворотних кодів з net startі net stopздається мені найкращим методом. Спробуйте подивитись на це: Коди повернення Net Start .


2
Пов'язана сторінка більше не існує. Таким чином, це більше коментар зараз.
Неоліск

5

Синтаксис завжди отримує мене .... так ...

Ось явно, як додати рядок до пакетного файлу, який знищить віддалену службу (на іншій машині), якщо ви адміністратор на обох машинах, запустіть .bat як адміністратор, а машини знаходяться в одному домені. Назва машини відповідає формату UNC \ myserver

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

У цьому випадку ... p4_1 було і ім'ям служби, і ім'ям відображення, коли ви переглядаєте властивості для служби в диспетчері сервісів. Ви повинні використовувати Ім'я служби.

Для ваших наркоманів Ops ... обов'язково додайте свій код причини та коментар! тобто "4", що дорівнює "Плановому", і коментар "Зупинка сервера для обслуговування"

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

1
Як це зробити, якщо для входу потрібно використовувати інший ідентифікатор користувача та пароль?
Frantumn

1
Ви запускаєтесь CMDяк інший користувач / ідентифікатор, виконуючи runas /user:Domain\UserName cmdпотім введіть свій пароль. CMD почне працювати як зазначений обліковий запис користувача.
користувач4317867

4

Ми хотіли б подумати, що "чиста зупинка" зупинить послугу. На жаль, реальність не така чорно-біла. Якщо служба потребує тривалого часу для зупинки, команда повернеться до того, як послуга припиниться. Ти не дізнаєшся, якщо не перевіриш рівень помилок.

Здається, рішення полягає в тому, щоб циклічно обертатись, шукаючи стан сервісу до його зупинки, з паузою щоразу обводячи цикл.

Але потім знову ...

Я бачу, як перша служба потребує тривалого часу, щоб зупинити її, тоді "чиста зупинка" для наступної послуги просто не робить нічого. Подивіться на сервіс у менеджера сервісів, і його стан все ще "Почався" - жодних змін до "Зупинки" немає. Але я можу зупинити цю другу послугу вручну за допомогою SCM, і вона припиняється через 3 або 4 секунди.


3

або ви можете почати віддалений сервіс за допомогою цього cmd: sc \\<computer> start <service>


3

Я просто використав приклад Йонаса вище і створив повний список від 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та працює в зворотному порядку.


3

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

Це може призвести до помилки: sc stop sc start

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


2

Ось команда Windows 10 для запуску відновлення системи за допомогою пакетного:

sc config swprv start= Auto

Також вам можуть сподобатися такі команди:

  • Змініть значення реєстру до автоматичного запуску Відновлення системи

    REG ADD "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f

  • Створіть точку відновлення системи

    Wmic.exe / Простір імен: \ root \ default Path SystemRestore Call CreateRestorePoint "djibe врятував ваш ПК", 100, 12

  • Змініть використання системи відновлення диска

    vssadmin resize shadowstorage / for = C: / on = C: / maxsize = 10%

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


1

SC може зробити все з сервісами ... запустити, зупинити, перевірити, налаштувати тощо ...


1

Іноді можна виявити, що зупинка не працює ..

Мій SQlServer іноді робить це. Використання наступних командних рядків вбиває його. Якщо вам справді потрібен ваш сценарій, щоб вбити речі, які не зупиняються. Я б хотів це зробити в крайньому випадку

taskkill /pid [pid number] /f

0

Я пишу службу Windows на C #, цикл зупинки / видалення / побудови / встановлення / запуску став занадто стомлюючим. Написав міні-скрипт, назвав його reploy.batі потрапив у вихідний каталог моєї Visual Studio (той, у якому є вбудований виконуваний сервіс) для автоматизації циклу.

Просто встановіть ці 3 вари

servicename : це відображається на панелі керування службою Windows (services.msc)

slndir : папка (не повний шлях), що містить файл вашого рішення (.sln)

binpath : повний шлях (не шлях до папки) до служби, що виконується з збірки

ПРИМІТКА. Для роботи команди це потрібно запустити з командного рядка Visual Studio Developer 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%

Можливо, це комусь допомагає :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.