Как я могу написать скрипт bat или cmd, чтобы остановить и надежно запустить службу с проверкой ошибок (или сообщить мне, что по какой-то причине она не удалась)?
Как я могу написать скрипт bat или cmd, чтобы остановить и надежно запустить службу с проверкой ошибок (или сообщить мне, что по какой-то причине она не удалась)?
Ответы:
Используйте команду 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
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
NET
не только для функций, связанных с сервисом, в то время SC
как только для функций, связанных с сервисом.
errorlevel
возвращает 2, смотрите здесь, как интерпретировать результат ошибки .
Вы можете использовать команду 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%
Отказ от ответственности: я написал это из головы, но я думаю, что это будет работать.
Для этого я создал свой личный пакетный файл, мой немного отличается, но вы можете изменить его по своему усмотрению. Я создал это некоторое время назад, потому что мне было скучно, и я хотел, чтобы люди могли просто ввести окончание, запуск, остановку или установку на авто. Этот 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. Вы должны использовать Имя Сервиса.
Для наркоманов Service Ops ... обязательно добавьте свой код причины и комментарий! то есть «4», что равно «Запланировано» и комментарий «Остановка сервера для обслуживания»
sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
CMD
от имени другого пользователя / идентификатора, runas /user:Domain\UserName cmd
затем вводите пароль. CMD начнет работать как указанная учетная запись пользователя.
Мы хотели бы думать, что «чистый стоп» остановит сервис. К сожалению, реальность не такая уж черно-белая. Если для остановки службы требуется много времени, команда вернется до остановки службы. Вы не будете знать, хотя, если вы не проверите уровень ошибки.
Похоже, что решение состоит в том, чтобы циклически проверять состояние службы до ее остановки, с паузой каждый раз вокруг цикла.
Но затем снова...
Я вижу, что первая служба долго останавливается, а затем «чистая остановка» для следующей службы, похоже, ничего не делает. Посмотрите на сервис в диспетчере сервисов, и его состояние все еще "Запущено" - без изменений в "Остановка". Тем не менее, я могу остановить этот второй сервис вручную с помощью 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
и работает в обратном порядке.
Ручной перезапуск службы в порядке - services.msc имеет кнопку «Перезагрузка», но в командной строке в командах sc и net отсутствует переключатель «перезапуск», и если перезапуск запланирован в файле cmd / bat, служба останавливается и запускается немедленно, иногда получает ошибку, потому что служба еще не остановлена, ей нужно некоторое время, чтобы завершить работу.
Это может привести к ошибке: sc stop sc start
Это хорошая идея для вставки тайм-аута, я использую ping (он пингуется каждые 1 секунду): sc stop ping localhost -n 60 sc start
Вот команда 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%
наслаждаться
Иногда вы можете найти остановку не работает ..
Мой SQlServer иногда делает это. Использование следующей командной строки убивает это. Если вам действительно нужен сценарий, чтобы убивать вещи, которые не прекращаются. Я бы сделал это в крайнем случае
taskkill /pid [pid number] /f
Я пишу службу 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%
Может быть, это кому-то помогает :)