Остановить и запустить службу через пакетный или cmd-файл?
Как я могу написать bat или cmd, чтобы остановить и запустить службу надежно с проверкой ошибок (или дайте мне знать, что она не была успешной по какой-либо причине)?
14 ответов
использовать 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
Кажется мне лучшим методом. Попробуйте взглянуть на это:Net Start коды возврата.
синтаксис всегда меня достает.... так...
здесь явно показано, как добавить строку в пакетный файл, который убьет удаленную службу (на другой машине), если вы являетесь администратором на обеих машинах, запустите .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" остановит службу. К сожалению, реальность не такая уж черно-белая. Если остановка службы занимает много времени, команда возвращается до остановки службы. Но вы не узнаете, если не проверите уровень ошибок.
решение, похоже, состоит в том, чтобы циклически искать состояние службы, пока она не остановится, с паузой каждый раз вокруг цикла.
но опять же...
Я вижу впервые служба занимает много времени, чтобы остановиться, тогда "net stop" для последующей службы просто ничего не делает. Посмотрите на службу в диспетчере служб, и ее состояние все еще "запущено" - никаких изменений в "остановке". Тем не менее, я могу остановить эту вторую службу вручную с помощью SCM, и она останавливается через 3 или 4 секунды.
Я просто использовал пример Джонаса выше и создал полный список от 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
и работает в обратном направлении.
ручной перезапуск службы-ok-services.msc имеет кнопку" Restart", но в командной строке как sc, так и net командам не хватает переключателя" restart", и если перезапуск запланирован в файле cmd/bat, служба остановлена и запущена немедленно, иногда она получает ошибку, потому что Служба еще не остановлена, ей нужно некоторое время, чтобы закрыть вещи.
Это может привести к ошибке: стоп sc старт СК
Это хорошая идея, чтобы вставить тайм-аут, я использую ping (он пингует каждые 1 секунду): Южная Каролина остановка ping localhost-n 60 старт СК
иногда вы можете найти стоп-не работает..
мой SQlServer иногда делает это. С помощью следующей командной строки убивает его. Если вам действительно нужен ваш сценарий, чтобы убить вещи, которые не останавливаются. Я бы сделал это в крайнем случае
taskkill /pid [pid number] /f
Я пишу службу windows на C#, цикл stop/uninstall/build/install/start стал слишком утомительным. Написал мини скрипт, называется он reploy.bat
и упал в мой выходной каталог Visual Studio (тот, который имеет встроенный исполняемый файл службы) для автоматизации цикла.
просто установите эти 3 vars
servicename
: это отображается на панели управления Службы Windows (службы.msc)
slndir
: папка (не полный путь), содержащая ваше решение (.ФСЛ) файл
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%
может быть, это поможет кому-то :)