Executar arquivo em lote como um serviço do Windows

159

Para executar um aplicativo, um arquivo em lotes precisa ser iniciado (o que faz coisas como iniciar o Jetty, exibir logs ativos etc.). O aplicativo funcionará apenas se esse arquivo em lotes estiver em execução. Portanto, sou forçado a ter esse arquivo em lotes em execução e não sair do servidor Windows.

Este arquivo em lotes pode ser executado como um serviço? Estou experimentando uma das sugestões de uma pergunta semelhante .

publicRavi
fonte
27
A programação em lote é o tópico do Stack Exchange.
Harry Johnston
12
Boa pergunta. +1. Os moderadores estão com muita raiva ... Também tenho outra boa resposta, mas a pergunta está encerrada ((
gavenkoa 9/15/15
Eu uso esse RunAsService: runasservice.com . É muito, muito mais simples de usar. Nenhuma bobagem de configuração XML. Basicamente, isso fornece apenas o executável RunAsService.exe, que agrupa qualquer aplicativo de console com argumentos de linha de comando como um serviço. Eu uso isso para executar scripts bash Cygwin como serviços !!! Infelizmente, esta ferramenta simples parece ser de código fechado.
Kaz
8
nomear para reabrir com base em "ferramentas de software comumente usadas por programadores". Qual é a resposta para essa pergunta definitivamente? Lembre-se também de que este é o primeiro resultado do Google ao pesquisar por "o Windows inicia o arquivo em lotes como um serviço". Portanto, seja no escopo restrito que alguns moderadores estejam 'no tópico', o resto do mundo pensa que é. Eu voto no pragmatismo sobre dogmatismo aqui.
Adam Cameron
Uma questão semelhante pode ser encontrado em serverfault serverfault.com/questions/54676/...
Stephen Quan

Respostas:

151

O NSSM é totalmente gratuito e extremamente fácil, executando o prompt de comando / terminal como administrador:

nssm install "YourCoolServiceNameLabel"

aparecerá uma caixa de diálogo para que você possa escolher onde está o arquivo que deseja executar.

desinstalar

nssm remove "YourCoolServiceNameLabel"
Junior Mayhé
fonte
25
+1 Nunca ouvi falar deste, mas é muito bom. NSSM não é uma merda!
Byron Whitlock
1
demorei 2 minutos para instalar um serviço
Ben Wilde
3
@Junior M Thanks !! Você me salvou. Passei 4 horas por isso. Obrigado!!
precisa saber é o seguinte
2
você sabe se existe uma maneira de fornecer nssmtodos os argumentos necessários na entrada para evitar a entrada de dados pop-up - estou tentando automatizar o processo?
amphibient
1
O NSSM continua sendo excluído em alguns de nossos clientes pelo antivírus GDATA. Sim, eu sei, na lista de permissões ... mas os clientes não fazem o que é bom para eles. Essa é a triste verdade.
Presidente da Dreamspace
61

Por que não simplesmente configurá-lo como uma tarefa agendada que está agendada para ser executada na inicialização?

Stephen Martin
fonte
1
Eu tenho vários arquivos em lote fazendo backups por robocópia que inicio por meio das Tarefas agendadas (vá para Painel de controle, Tarefas agendadas) em execução em um servidor Win 2003. Funciona um tratamento ...
SAL
Acabei de fazer isso com um script que usamos para monitorar nosso serviço de backup. Ele funciona como um encanto.
Music2myear 23/03/12
1
esta é a melhor solução imo. não é necessário software de terceiros nem interface de linha de comando. Além disso, o Agendador de tarefas fornece muitas opções para gatilhos, condições etc.
dev
3
Funciona agora que eu descobri isso: Quando a tarefa é executada na inicialização (com "Executar se o usuário está logado ou não")% UserProfile% é C: \ Users \ Default \ A qualquer momento, será o esperado C: \ Users \ ExpectedUser \ Isso pode criar falhas misteriosas para alguns arquivos .bat que parecem funcionar bem em outras tarefas agendadas.
user1754036
2
As tarefas agendadas são notoriamente não confiáveis ​​- na verdade, me deparei com essa pergunta por causa de todos os problemas que tenho enfrentado com tarefas que não são iniciadas a tempo sem motivo aparente.
22

Existe um cmd interno do windows para fazer isso: sc create . Não é tão chique quanto o nssm, mas você não precisa baixar um software adicional.

sc create "ServiceName" start= demand displayname= "DisplayName" binpath= [path to .bat file]

Nota

  • start = demand significa que você deve iniciar o serviço sozinho
  • espaço em branco é necessário após =
  • Eu encontrei um erro no início do serviço que o serviço não respondeu em tempo hábil, mas estava claro que o serviço executou o .bat com êxito. Ainda não investigamos isso, mas esse segmento experimentou a mesma coisa e o resolveu usando o nssm para instalar o serviço.
w00ngy
fonte
4
O Windows parece não executar arquivos .bat como serviços.
24918 Perkins
@ Perkins - A minha estava trabalhando ontem em algumas máquinas. Você está experimentando algo específico? Eu encontrei um erro que o serviço não respondeu de maneira oportuna no início, mas o arquivo .bat era para inicializar o servidor Kibana node.js e estava sendo executado com êxito, mesmo com o erro. Os caras desse segmento pareciam experimentar a mesma coisa, mas não experimentavam o nssm. stackoverflow.com/a/40130630/885535
w00ngy
2
No meu caso, os arquivos que o arquivo em lotes deve criar não são criados e os programas não estão em execução, portanto, devo assumir que não o está iniciando. Eu consegui contornar isso criando o serviço para executar cmd.exe / C <batchfile>. Observe que estou usando o Windows 10, então isso pode ser algo novo de "segurança".
26518 Perkins
@ Perkins Acabei de executá-lo no win10 1803 sem problemas, inicia meu servidor node.js. O arquivo bat cria os arquivos e executa os serviços quando chamado do cmd ou do PowerShell? Você recebe alguma caixa de mensagem quando inicia o serviço? Seu serviço tem permissão para esses diretórios? Você pode adicionar algum erro ao registrar no bastão gravando em um arquivo de log local, para ver se está funcionando.
w00ngy
1
Get " Erro 1053: O serviço não respondeu à solicitação de início ou controle em tempo hábil. "
Alex Klaus
5

Não há necessidade de software extra. Use o agendador de tarefas -> criar tarefa -> oculto. A caixa de seleção para oculto está no canto inferior esquerdo. Defina a tarefa a ser acionada no login (ou em qualquer condição que você desejar) e escolha a tarefa na guia ações. A execução oculta garante que a tarefa seja executada silenciosamente em segundo plano como um serviço.

Observe que você também deve definir o programa para executar "se o usuário está conectado ou não" ou o programa ainda será executado em primeiro plano.

Zediiiii
fonte
3

Como Doug Currie diz, use RunAsService.

Pela minha experiência passada, você deve se lembrar que o Serviço que você gera

  • tem um conjunto completamente diferente de variáveis ​​de ambiente
  • deve ser cuidadosamente inspecionado para problemas de direitos / permissões
  • pode causar estragos se abrir caixas de diálogo solicitando qualquer tipo de entrada

não tenho certeza se o último ainda se aplica ... foi uma grande égua noturna em um projeto em que trabalhei há algum tempo.

Lexu
fonte
3

Embora não seja gratuito (mas US $ 39), o FireDaemon funcionou tão bem para mim que preciso recomendá-lo. Ele executará seu arquivo em lote, mas possui muitas funcionalidades adicionais e muito úteis, como agendamento, monitoramento de serviços, instalação de serviços baseada em GUI ou XML, dependências, variáveis ​​ambientais e gerenciamento de logs.

Comecei usando o FireDaemon para iniciar os servidores de aplicativos JBoss ( run.bat ), mas logo percebi que a riqueza das habilidades de configuração do FireDaemon me permitia abandonar o arquivo em lotes e recriar a intenção de seus comandos na definição de serviço do FireDaemon.

Há também um SUPER FireDaemon chamado Trinity, que você pode procurar se tiver um grande número de servidores Windows nos quais gerenciar esse serviço (ou tecnicamente, qualquer serviço).

Nicholas
fonte
2

No Windows 2019 Server, você pode executar um servidor java Minecraft com estes comandos:

sc criar minecraft-server DisplayName = "minecraft-server" binpath = "cmd.exe /CC:\Users\Administrator\Desktop\rungui1151.lnk" type = own start = auto

O arquivo .lnk é um atalho padrão do Windows para um arquivo em lotes.

--- O arquivo .bat começa ---

java -Xmx40960M -Xms40960M -d64 -jar minecraft_server.1.15.1.jar

--- O arquivo .bat termina ---

Tudo isso porque:

serviço não sabe como iniciar em uma pasta,

O cmd.exe não sabe como iniciar em uma pasta

Iniciar o serviço produzirá um erro de "maneira oportuna", mas o arquivo de log revela que o servidor está em execução.

Se você precisar desligar o servidor, entre no gerenciador de tarefas e encontre o servidor java em processos em segundo plano e finalize-o ou encerre o servidor no jogo usando o comando / stop ou para outros programas / servidores, use os métodos relevante para o servidor.

Goofyseeker311
fonte
Isso não fornece uma resposta para a pergunta. Depois de ter reputação suficiente, você poderá comentar qualquer postagem ; em vez disso, forneça respostas que não exijam esclarecimentos do solicitante . - Da avaliação
Jeremy J Starcher
1
se você a ler corretamente, notará que ela contém a resposta perfeita, relevante para um exemplo
Goofyseeker311
0

O AlwaysUp executará facilmente seu arquivo em lotes como um serviço. É semelhante ao FireDaemon (mencionado acima) e não é gratuito, mas você pode achar que o recurso rico é um ativo em um ambiente profissional.

Boa sorte!

CoreTech
fonte