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

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

<p>используйте команду <code>sc</code> (управление службами), она дает вам гораздо больше возможностей, чем просто <code>start</code> & <code>stop</code>.</p><pre> описание: 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 </pre>

<pre><code>net start [servicename] </code></pre><p>а также</p><pre><code>net stop [servicename] </code></pre><p>скажу вам, были ли они успешными или провалились довольно четко. например</p><pre><code>u:\>net stop alerter the alerter service is not started. more help is available by typing net helpmsg 3521. </code></pre><p>при запуске из пакетного файла у вас есть доступ к errorlevel кода возврата. 0 указывает на успех. все, что выше, означает неудачу.</p><p>как файл bat, <code>error.bat</code>:</p><pre><code>@echo off net stop alerter if errorlevel 1 goto error exit :error echo there was a problem pause </code></pre><p>вывод выглядит так:</p><pre><code>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 . . . </code></pre><p><strong>коды возврата</strong></p><pre><code> - 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 </code></pre><p><strong>изменить 20.04.2015</strong></p><p>коды возврата: </p><blockquote> <p>команда net не возвращает документированные коды возврата класса win32\_service (служба неактивна, время ожидания запроса на обслуживание и т.д.), и для многих ошибок просто возвращает уровень ошибки 2.</p> </blockquote><p>смотрите здесь: <a href="http://ss64.com/nt/net\_service.html">http://ss64.com/nt/net\_service.html</a> </p>

<p>вы можете использовать команду net start, а затем проверить переменную среды errorlevel, например,.</p><pre><code>net start [your service] if %errorlevel% == 2 echo could not start service. if %errorlevel% == 0 echo service started successfully. echo errorlevel: %errorlevel% </code></pre><p>отказ от ответственности: я написал это из головы, но я думаю, что это будет работать.</p>

<p>вместо проверки кодов это тоже работает</p><pre><code>net start "apache tomcat" || goto exiterror :end exit 0 :exiterror echo an error has occurred while starting the tomcat services exit 1 </code></pre>

<p>я создал для этого свой личный пакетный файл, мой немного отличается, но вы можете свободно изменять его, как считаете нужным .... я создал это некоторое время назад, потому что мне было скучно, и я хотел сделать простой способ для людей быть возможность ввода окончания, запуска, остановки или установки на авто. этот bat-файл просто запрашивает ввод имени службы, и он сделает все остальное за вас. я не осознавал, что он искал что-то, что говорило об ошибке, я, должно быть, неправильно понял эту часть. хотя обычно это можно сделать, введя >> output.txt в конце строки. </p><p>% var% - это просто способ, позволяющий пользователю вводить в него свой собственный сервис, вместо того, чтобы каждый раз изменять файл bat каждый раз, когда вы хотите запустить/остановить другой сервис. </p><p>если я ошибаюсь, любой может смело поправлять меня в этом. </p><pre><code>@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 </code></pre>

<p>использование кодов возврата из <code>net start</code> и <code>net stop</code> кажется мне лучшим способом. попробуйте взглянуть на это: <a href="http://www.eggheadcafe.com/software/aspnet/31708197/net-start-return-codes.aspx">коды возврата net start</a> .</p>

<p>синтаксис всегда получает меня .... так что ...</p><p>здесь подробно показано, как добавить в пакетный файл строку, которая убьет удаленную службу (на другом компьютере), если вы являетесь администратором на обеих машинах, запустите .bat от имени администратора, и машины будут в одном домене. имя машины соответствует формату unc\myserver</p><pre><code>sc \\ip.ip.ip.ip stop p4\_1 </code></pre><p>в этом случае ... p4\_1 было одновременно именем службы и отображаемым именем при просмотре свойств для службы в service manager. вы должны использовать имя сервиса.</p><p>для наркоманов service ops ... обязательно добавьте свой код причины и комментарий! то есть «4», что равно «запланировано» и комментарий «остановка сервера для обслуживания»</p><pre><code>sc \\ip.ip.ip.ip stop p4\_1 4 stopping server for maintenance </code></pre>

<p>мы хотели бы думать, что «чистый стоп» остановит сервис. к сожалению, реальность не такая уж черно-белая. если остановка службы занимает много времени, команда вернется до остановки службы. вы не будете знать, хотя, если вы не проверите уровень ошибки.</p><p>похоже, что решение заключается в циклическом поиске состояния сервиса до его остановки, с паузой каждый раз в цикле.</p><p>но затем снова...</p><p>я вижу, что первая служба останавливается очень долго, а затем «чистая остановка» для следующей службы, похоже, ничего не делает. посмотрите на сервис в диспетчере сервисов, и его состояние все еще "запущено" - без изменений в "остановка". тем не менее, я могу остановить этот второй сервис вручную с помощью scm, и он останавливается через 3 или 4 секунды.</p>

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

<p>ручной перезапуск службы в порядке - services.msc имеет кнопку «перезагрузка», но в командной строке в командах sc и net отсутствует переключатель «перезапуск», и если перезапуск запланирован в файле cmd/bat, служба останавливается и запускается немедленно, иногда получает ошибку, потому что служба еще не остановлена, ей нужно некоторое время, чтобы завершить работу. </p><p>это может привести к ошибке: sc stop sc start </p><p>это хорошая идея для вставки тайм-аута, я использую ping (он пингуется каждые 1 секунду): sc stop ping localhost -n 60 sc start </p>

<p>я просто использовал приведенный выше пример джонаса и создал полный список от 0 до 24 уровней ошибок. другое сообщение верно, что <code>net start</code> и <code>net stop</code> используют только <code>errorlevel</code> 0 для успеха и 2 для неудачи.</p><p>но вот что сработало для меня:</p><pre><code>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% </code></pre><p>измените <code>stop</code> на <code>start</code> и работает в обратном порядке.</p>

<p><code>sc</code> может делать все со службами ... запускать, останавливать, проверять, настраивать и многое другое ... </p>

<p>иногда вы можете найти остановку не работает .. </p><p>мой sqlserver иногда делает это. использование следующей командной строки убивает это. если вам действительно нужен ваш скрипт, чтобы убивать вещи, которые не прекращаются. я бы сделал это в крайнем случае</p><pre><code>taskkill /pid [pid number] /f </code></pre>

<p>вот команда windows 10 для запуска восстановления системы с помощью пакета:</p><pre><code>sc config swprv start= auto </code></pre><p>вам также могут понравиться эти команды:</p><ul> <li><p>измените значение реестра для автоматического запуска восстановления системы</p> <p>reg добавьте "hklm\программное обеспечение\microsoft\windows nt\currentversion\systemrestore"/v disablesr/t reg\_dword/d 0/f</p></li> <li><p>создать точку восстановления системы</p> <p>wmic.exe/пространство имен:\root\default путь systemrestore вызов createrestorepoint "djibe спас ваш компьютер", 100, 12</p></li> <li><p>изменить использование диска восстановления системы</p> <p>vssadmin изменить размер shadowstorage/for = c:/on = c:/maxsize = 10%</p></li> </ul><p>наслаждаться</p>

<p>я пишу службу windows на c #, цикл остановки/удаления/сборки/установки/запуска стал слишком утомительным. написал мини-скрипт, назвал его <code>reploy.bat</code> и поместил в мой выходной каталог visual studio (в котором есть исполняемый файл встроенной службы) для автоматизации цикла. </p><p>просто установите эти 3 переменные </p><p><code>servicename</code>: отображается на панели управления службами windows (services.msc)</p><p><code>slndir</code>: папка (не полный путь), содержащая файл вашего решения (.sln)</p><p><code>binpath</code>: полный путь (не путь к папке) к исполняемому файлу службы из сборки</p><p>примечание. это необходимо запустить из командной строки разработчика visual studio, чтобы команда <code>msbuild</code> работала.</p><pre><code>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% </code></pre><p>может быть, это кому-то помогает :)</p>