it-swarm.com.ru

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

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

264
Keng

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

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

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

 Следующие команды не требуют имени службы: 
 sc <сервер> <команда> <опция> 
 boot ------------ (ok | bad) Указывает, должна ли последняя загрузка 
 сохраниться как последняя известная исправная конфигурация загрузки 
 Lock ------------ Блокирует сервисную базу данных 
 QueryLock ------- Запрашивает LockStatus для базы данных SCManager 
 ПРИМЕР:
 sc start MyService 
326
Ferruccio
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 (служба неактивна, время ожидания запроса на обслуживание и т.д.), И для многих ошибок просто возвращает уровень ошибки 2.

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

193
Bill Michell

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

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

27
Jonas Gulle

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

net start "Apache Tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the Tomcat services  
exit 1  
8
vanval

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

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

6
ZombieSheep

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

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

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

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

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

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

4
DaveH

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

3
onionpsy

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

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

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

2
Kuleris

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

2
Clinton

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

1
Axeman

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

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

taskkill /pid [pid number] /f
1
andrew pate

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

Я пишу службу 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%

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

0
sh87