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

288

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

Кенг
источник
Может быть, это немного не по теме (поскольку вы просите инструкции bat & cmd), но: PowerShell дает вам большой контроль и обратную связь для выполнения таких действий.
GvS

Ответы:

347

Используйте команду SC(service control), она дает вам гораздо больше возможностей, чем просто start& stop.

  ОПИСАНИЕ:
          SC - программа командной строки, используемая для связи с
          NT Service Controller и сервисы.
  ИСПОЛЬЗОВАНИЕ:
      sc <сервер> [команда] [имя службы] ...

      Параметр <server> имеет форму "\\ ServerName"
      Дополнительную справку по командам можно получить, набрав: "sc [command]"
      Команды:
        запрос ----------- Запрашивает статус для службы, или
                        перечисляет статус для видов услуг.
        queryex --------- Запрашивает расширенный статус для службы, или
                        перечисляет статус для видов услуг.
        начать ----------- Запускает службу.
        пауза ----------- Отправляет запрос управления PAUSE в службу.
        опросить ----- Отправляет запрос управления INTERROGATE в службу.
        продолжить -------- Посылает запрос управления ПРОДОЛЖЕНИЕ в службу.
        остановка ------------ Отправляет запрос на остановку в службу.
        config ---------- Изменяет конфигурацию службы (постоянная).
        description ----- Изменяет описание услуги.
        сбой --------- Изменяет действия, предпринятые службой при сбое.
        qc -------------- Запрашивает информацию о конфигурации для службы.
        qdescription ---- Запрашивает описание услуги.
        qfailure -------- Запрашивает действия, предпринятые службой при сбое.
        удалить ---------- Удаляет службу (из реестра).
        создать ---------- Создает сервис. (добавляет его в реестр).
        control --------- Отправляет элемент управления в службу.
        sdshow ---------- Отображает дескриптор безопасности службы.
        sdset ----------- Устанавливает дескриптор безопасности сервиса.
        GetDisplayName - получает DisplayName для службы.
        GetKeyName ------ Получает ServiceKeyName для службы.
        EnumDepend ------ Перечисляет сервисные зависимости.

      Следующие команды не требуют имени службы:
      sc <сервер> <команда> <опция>
        boot ------------ (ok | bad) Указывает, должна ли последняя загрузка
                        быть сохранены как последняя известная хорошая конфигурация загрузки
        Lock ------------ Блокирует сервисную базу данных
        QueryLock ------- Запрашивает LockStatus для базы данных SCManager
  ПРИМЕР:
          sc start MyService
Ферруччо
источник
1
Я согласен, что это лучше, чем чистый старт / стоп. Обратите внимание, что на удаленных машинах также есть возможность касаться сервисов.
Программист вне закона
1
Отличный ответ. Но вы должны быть администратором, чтобы запустить «SC start service». Я нашел решение для этого здесь . (Принятый ответ содержит решение)
Майкл К.
56
Проблема с SC заключается в том, что команда возвращается сразу, а не после завершения действия. Если вы хотите перезапустить службу через командный файл (остановка, затем запуск), остановка возвращается немедленно, затем запуск завершается неудачно, потому что служба не остановлена. Чистый стоп / старт возвращается после завершения действия, поэтому не имеет этой проблемы.
Дом
Я открыл cmd в режиме администратора, получая сообщение об ошибке Синтаксис этой команды: NET STOP service
Satish Singh
Есть ли способ проверить, если служба остановлена ​​должным образом? в 2020 году?
Ананд Варки Филипс
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 указывает на успех. Все, что выше, означает неудачу.

В файле летучей мыши, 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

Билл Мичелл
источник
1
NET не только для функций, связанных с сервисом, в то время SC как только для функций, связанных с сервисом.
Wernight
3
Этот ответ лучше, потому что команда «net» блокирует и ждет, пока служба запустится или остановится, прежде чем пакетный скрипт продолжит выполняться.
Стивен
Поскольку (как говорит Edit) большую часть времени 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  
vanval
источник
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 .

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

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

Здесь подробно показано, как добавить в пакетный файл строку, которая убьет удаленную службу (на другом компьютере), если вы являетесь администратором на обеих машинах, запустите .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
ATSiem
источник
1
Как мне это сделать, если мне нужно использовать другой идентификатор пользователя и пароль для входа в систему?
Февраль
1
Вы запускаете CMDот имени другого пользователя / идентификатора, runas /user:Domain\UserName cmdзатем вводите пароль. CMD начнет работать как указанная учетная запись пользователя.
user4317867
4

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

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

Но затем снова...

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

DaveH
источник
3

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

onionpsy
источник
3

Я просто использовал приведенный выше пример Джонаса и создал полный список от 0 до 24 уровней ошибок. Другой пост является правильным, net startи net stopиспользовать только errorlevel0 для успеха и 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 и net отсутствует переключатель «перезапуск», и если перезапуск запланирован в файле cmd / bat, служба останавливается и запускается немедленно, иногда получает ошибку, потому что служба еще не остановлена, ей нужно некоторое время, чтобы завершить работу.

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

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

Kuleris
источник
2

Вот команда 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%

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

djibe
источник
1

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

лесоруб
источник
1

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

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

taskkill /pid [pid number] /f
Эндрю Пэйт
источник
0

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

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

servicename : это отображается на панели управления Windows Service (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%

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

sh87
источник