Як я можу скриптувати bat або cmd, щоб зупинитись та надійно запустити послугу з перевірки помилок (або дозволити мені знати, що вона не була успішною з будь-якої причини)?
Як я можу скриптувати bat або cmd, щоб зупинитись та надійно запустити послугу з перевірки помилок (або дозволити мені знати, що вона не була успішною з будь-якої причини)?
Відповіді:
Використовуйте команду 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
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
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 було і ім'ям служби, і ім'ям відображення, коли ви переглядаєте властивості для служби в диспетчері сервісів. Ви повинні використовувати Ім'я служби.
Для ваших наркоманів 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, так і чистих команд відсутній перемикач "перезапуск", і якщо перезапуск запланований у файлі cmd / bat, сервіс зупиняється і запускається негайно, іноді це отримує помилку, оскільки сервіс ще не зупинений, йому потрібно деякий час, щоб вимкнути речі.
Це може призвести до помилки: sc stop sc start
Хороша ідея вставити тайм-аут, я використовую ping (пінг кожні 1 секунду): sc зупиняє ping localhost -n 60 sc start
Ось команда 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%
Насолоджуйтесь
Іноді можна виявити, що зупинка не працює ..
Мій SQlServer іноді робить це. Використання наступних командних рядків вбиває його. Якщо вам справді потрібен ваш сценарій, щоб вбити речі, які не зупиняються. Я б хотів це зробити в крайньому випадку
taskkill /pid [pid number] /f
Я пишу службу 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%
Можливо, це комусь допомагає :)