Como posso criar um script em um bastão ou cmd para parar e iniciar um serviço de forma confiável com a verificação de erros (ou me avise que não foi bem-sucedido por qualquer motivo)?
288
Como posso criar um script em um bastão ou cmd para parar e iniciar um serviço de forma confiável com a verificação de erros (ou me avise que não foi bem-sucedido por qualquer motivo)?
Respostas:
Use o
SC
comando (service control), ele oferece muito mais opções do que apenas ostart
&stop
.fonte
e
diga se eles tiveram sucesso ou falharam claramente. Por exemplo
Se estiver executando a partir de um arquivo em lotes, você terá acesso ao ERRORLEVEL do código de retorno. 0 indica sucesso. Qualquer coisa mais alta indica falha.
Como um arquivo bat,
error.bat
:A saída é assim:
Códigos de retorno
Editar 20.04.2015
Códigos de retorno:
Veja aqui: http://ss64.com/nt/net_service.html
fonte
NET
não é apenas para funções relacionadas ao serviço, masSC
é apenas para funções relacionadas ao serviço.errorlevel
retorno é 2, veja aqui como interpretar o resultado do erro .Você pode usar o comando NET START e depois verificar a variável de ambiente ERRORLEVEL, por exemplo
Disclaimer: Eu escrevi isso do alto da minha cabeça, mas acho que vai funcionar.
fonte
Em vez de verificar códigos, isso também funciona
fonte
Eu criei meu arquivo de lote pessoal para isso, o meu é um pouco diferente, mas fique à vontade para modificar como achar melhor. Eu criei isso há pouco tempo porque estava entediado e queria criar uma maneira simples de as pessoas poderem inserir final, iniciar, parar ou definir como automático. Este arquivo BAT simplesmente solicita que você insira o nome do serviço e fará o resto por você. Não percebi que ele estava procurando algo que indicava algum erro, devo ter interpretado mal essa parte. Embora normalmente isso possa ser feito, insira >> output.txt no final da linha.
O% var% é apenas uma maneira de o usuário poder inserir seu próprio serviço nisso, em vez de precisar modificar o arquivo bat toda vez que desejar iniciar / parar um serviço diferente.
Se eu estiver errado, qualquer um pode ficar à vontade para me corrigir.
fonte
Usar os códigos de retorno
net start
e menet stop
parece o melhor método. Experimente o seguinte: Códigos de retorno do Net Start .fonte
A sintaxe sempre me pega .... então ...
Aqui está explicitamente como adicionar uma linha a um arquivo em lotes que matará um serviço remoto (em outra máquina) se você for um administrador em ambas as máquinas, execute o .bat como administrador e as máquinas estejam no mesmo domínio. O nome da máquina segue o formato UNC \ myserver
Nesse caso ... p4_1 era o nome do serviço e o nome para exibição, quando você visualizava as propriedades do serviço no Service Manager. Você deve usar o nome do serviço.
Para os viciados em Operações de Serviço ... anexe seu código de razão e comente! ou seja, '4' igual a 'Planejado' e comente 'Parando o servidor para manutenção'
fonte
CMD
como o outro usuário / IDrunas /user:Domain\UserName cmd
, digitando sua senha. O CMD começará a ser executado como a conta de usuário especificada.Gostaríamos de pensar que "net stop" interromperá o serviço. Infelizmente, a realidade não é tão preto e branco. Se o serviço demorar muito para parar, o comando retornará antes que o serviço pare. Você não saberá, a menos que verifique o nível de erro.
A solução parece fazer um loop, procurando o estado do serviço até que seja interrompido, com uma pausa cada vez que o loop for interrompido.
Mas, novamente ...
Estou vendo o primeiro serviço demorar muito tempo para parar, então o "net stop" para um serviço subseqüente parece não fazer nada. Observe o serviço no gerenciador de serviços e seu estado ainda é "Iniciado" - nenhuma alteração para "Parando". No entanto, eu posso parar este segundo serviço manualmente usando o SCM, e ele pára em 3 ou 4 segundos.
fonte
ou você pode iniciar o serviço remoto com este cmd:
sc \\<computer> start <service>
fonte
Acabei de usar o exemplo de Jonas acima e criei uma lista completa de 0 a 24 níveis de erro. Outra postagem está correta
net start
enet stop
use apenaserrorlevel
0 para o sucesso e 2 para falha.Mas é isso que funcionou para mim:
Mude
stop
parastart
e trabalhe ao contrário.fonte
A reinicialização manual do serviço está ok - services.msc possui o botão "Reiniciar", mas na linha de comando os comandos sc e net não possuem uma opção "restart" e se a reinicialização estiver agendada no arquivo cmd / bat, o serviço será interrompido e iniciado imediatamente, às vezes recebe um erro porque o serviço ainda não foi interrompido, ele precisa de algum tempo para desligar as coisas.
Isso pode gerar um erro: sc stop sc start
É uma boa idéia inserir o tempo limite, eu uso ping (ele apita a cada 1 segundo): sc stop ping localhost -n 60 sc start
fonte
Aqui está o comando do Windows 10 para iniciar a Restauração do Sistema usando o lote:
Você também pode gostar desses comandos:
Altere o valor do registro para iniciar automaticamente a restauração do sistema
REG ADICIONAR "HKLM \ SOFTWARE \ Microsoft \ Windows \ Versão Atual \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f
Crie um ponto de restauração do sistema
Wmic.exe / Namespace: \ root \ default Caminho SystemRestore Chame CreateRestorePoint "djibe salvou seu PC", 100, 12
Alterar o uso do disco de restauração do sistema
O vssadmin redimensiona o armazenamento de sombra / para = C: / on = C: / maxsize = 10%
Aproveitar
fonte
SC
pode fazer tudo com serviços ... iniciar, parar, verificar, configurar e muito mais ...fonte
Às vezes você pode encontrar a parada não funciona ..
Meu SQlServer às vezes faz isso. O uso da seguinte linha de comando a mata. Se você realmente precisa do seu script para matar coisas que não param. Eu faria isso como último recurso
fonte
Estou escrevendo um serviço do Windows em C #, o loop de parar / desinstalar / criar / instalar / iniciar ficou muito cansativo. Escrevi um mini script, chamei
reploy.bat
e soltei no meu diretório de saída do Visual Studio (um que possui o serviço executável incorporado) para automatizar o loop.Basta definir esses 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 da solução (.sln)binpath
: caminho completo (não o caminho da pasta) para o serviço executável a partir da compilaçãoObservação: isso precisa ser executado a partir da linha de
msbuild
comando do Visual Studio Developer para que o comando funcione.Talvez isso ajude alguém :)
fonte