Pergunta

Como posso roteiro um morcego ou cmd para parar e iniciar um serviço confiável com a verificação de erros (ou deixe-me saber que não foi bem sucedida por qualquer motivo)?

Foi útil?

Solução

Use o comando SC (controle de serviço), que lhe dá muito mais opções do que apenas 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

Outras dicas

net start [serviceName]

e

net stop [serviceName]

dizer se eles tiveram sucesso ou não muito claramente. Por exemplo

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

Se a execução de um arquivo de lote, você tem acesso ao ERRORLEVEL do código de retorno. 0 indica sucesso. Qualquer coisa maior indica falha.

Como um arquivo bat, error.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

Os olhares saída como esta:

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 . . .

Códigos de retorno

 - 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

Editar 2015/04/20

Códigos de retorno:

O comando NET não retorna as win32_service códigos documentados retorno classe (Serviço Não Ativo, Serviço de Pedido de Timeout, etc) e por muitos erros simplesmente retornará ERRORLEVEL 2.

Olhe aqui: http://ss64.com/nt/net_service.html

Você pode usar o comando NET START e em seguida, verifique a variável de ambiente ERRORLEVEL, por exemplo.

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

Disclaimer:. Eu escrevi isso a partir do topo da minha cabeça, mas eu acho que ele vai trabalhar

Em vez de códigos de verificação, isso funciona muito

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  

Eu criei meu arquivo de lote pessoal para este, o meu é um pouco diferente, mas sinto livre para modificar como quiser. Eu criei este pouco tempo atrás, porque eu estava entediado e queria fazer uma maneira simples para que as pessoas sejam capazes de acabar com entrada, iniciar, parar, ou a criação de auto. Este arquivo BAT simplesmente solicita que você insira o nome do serviço e ele fará o resto para você. Eu não tinha percebido que ele estava procurando por algo que disse qualquer erro, devo ter interpretado mal essa parte. Embora normalmente isso pode ser feito através da introdução >> output.txt na extremidade da linha.

O% var% é apenas uma maneira para que o usuário seja capaz de introduzir o seu próprio serviço para isso, em vez de ter que ir modificar o arquivo bat cada vez que você deseja iniciar / parar um serviço diferente.

Se eu estiver errado, qualquer um pode se sentir livre para me corrigir neste.

@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

Usando os códigos de retorno de net start e net stop parece ser o melhor método para mim. Tente uma olhada nisso: net start códigos de retorno .

Sintaxe sempre me pega .... então ...

Aqui está explicitamente como adicionar uma linha de um arquivo de lote que vai matar um serviço remoto (em outra máquina), se você é um administrador em ambas as máquinas, execute o .bat como um administrador, e as máquinas estão no mesmo domínio. O nome da máquina segue o formato UNC \ myserver

sc \\ip.ip.ip.ip stop p4_1

Neste caso ... p4_1 era tanto o nome do serviço eo nome de exibição, quando você exibir as propriedades para o serviço no Service Manager. Você deve usar o nome do serviço.

para o seu serviço Ops junkies ... não deixe de anexar o seu código de razão e comentar! ou seja, '4' o que equivale a 'planejado' e comentário 'Parar servidor para manutenção'

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance

Gostaríamos de pensar que "net stop" vai parar o serviço. Infelizmente, a realidade não é tão preto e branco. Se o serviço leva um longo tempo para parar, o comando retornará antes que o serviço foi interrompido. Você não vai saber, no entanto, a menos que você verifique errorlevel.

A solução parece ser fazer um loop rodada procurando o estado do serviço até que seja parado, com uma pausa a cada vez em volta do loop.

Mas, novamente ...

Eu estou vendo o primeiro serviço de levar um longo tempo para parar, então o "net stop" para um serviço posterior apenas parece não fazer nada. Olhe para o serviço no gerenciador de serviços, e seu estado ainda está "Iniciado" - sem alteração com "Parar". No entanto, eu posso parar este segundo serviço manualmente usando o SCM, e ele pára em 3 ou 4 segundos.

ou você pode iniciar o serviço remoto com este cmd: sc \\<computer> start <service>

Eu apenas usei exemplo Jonas' acima e criado lista completa de 0 a 24 errorlevels. Outro post é correto que net start e net stop só usam errorlevel 0 para o sucesso e 2 para o fracasso.

Mas isto é o que funcionou para mim:

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%

Alterar stop para start e funciona ao contrário.

Manual restart serviço é ok - services.msc tem botão "Restart", mas na linha de comando tanto sc e comandos net não tem um interruptor de "restart" e se restart está prevista no arquivo cmd / bat, o serviço é interrompido e iniciado imediatamente , às vezes torna-se um erro porque o serviço ainda não está parado, ele precisa de algum tempo para as coisas desligado.

Isto pode gerar um erro: parada sc início sc

É uma boa idéia para inserção de tempo limite, eu usar o ping (sibila cada 1 segundo): parada sc pingue localhost -n 60 início sc

SC pode fazer tudo com serviços ... iniciar, parar, cheque, configure, e muito mais ...

Às vezes você pode encontrar o ponto de não trabalho ..

Meu SQLServer às vezes faz isso. Usando a seguinte linha de comando mata. Se você realmente precisa de seu script para coisas matar que não pára. Eu teria que fazer isso como um último recurso

taskkill /pid [pid number] /f

Aqui está o comando do Windows 10 para iniciar a restauração do sistema usando lote:

sc config swprv start= Auto

Você também pode gostar os comandos:

  • Alterar valor de registo para auto iniciar a restauração do sistema

    REG ADD "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f

  • Criar um ponto de restauração

    Wmic.exe / Namespace: \ root \ Path padrão SystemRestore Chamada CreateRestorePoint "djibe salvou o PC", 100, 12

  • Alterar a restauração do sistema o uso do disco

    Vssadmin redimensionamento shadowstorage / = para C: / no = C: / maxsize = 10%

Aproveite

Eu estou escrevendo um serviço do Windows em C #, o stop / desinstalação / build / instalação / start loop de foi muito cansativo. Escreveu um mini roteiro, chamou-reploy.bat e caiu no meu diretório de saída Visual Studio (que tem o serviço executável construído) para automatizar o loop.

Basta definir estes 3 vars

servicename: isso aparece no painel de controle do Windows Service (services.msc)

slndir: pasta (não o caminho completo) que contém o arquivo de solução (.sln)

binpath: caminho completo (não o caminho da pasta) para o executável serviço da construção

NOTA:. Isso precisa ser executado a partir do Visual Studio Developer de linha de comando para o comando msbuild ao trabalho

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%

Talvez isso ajude alguém:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top