Certificando-se de que o executável esteja sempre em execução?

4

Eu tenho um vps executando o Windows Server 2008 R2.

Eu tenho um executável que sempre precisa estar em execução. Mesmo que eu não esteja logado.

Digamos que haja um problema e o servidor seja reiniciado inesperadamente. Não preciso fazer login para que ele seja iniciado. Existe alguma maneira de fazer isso?

Além disso, eu não acho que isso poderia ser feito, mas, digamos que o aplicativo falhe, existe uma maneira de fazer o sistema operacional fechar o executável travado e reiniciá-lo?

Além disso, quando eu fizer login como administrador, se eu pudesse vê-lo em execução, isso também seria ótimo. (wg: janela do console visível)

Obrigado

    
por jmasterx 14.12.2013 / 16:37

2 respostas

8

Como é seu jogo, significando que você possui o código, isso significa que você precisa reescrevê-lo como um Serviço do Windows. Servidores são feitos para executar serviços. Os Serviços do Windows são projetados para serem executados sem interação do usuário, independentemente de alguém estar conectado ou não, e podem ser iniciados automaticamente quando a máquina é inicializada. (Basta definir seu serviço como Automático e ele iniciará logo após o carregamento do SO). Além disso, você pode definir opções avançadas de recuperação no controlador de serviços, para que o Windows reinicie automaticamente o serviço para você se ele falhar ou até mesmo enviar um email notificando-o de que o seu serviço falhou se você estivesse inclinado.

Você não interage diretamente com um serviço do Windows. Os Serviços do Windows não têm interface de usuário e não criam uma janela em uma área de trabalho. (Eles não devem. ) Você não verá uma janela de console quando você fizer logon. No entanto, você pode escrever um aplicativo separado que possa interagir com seu serviço, para permitir que um usuário defina configurações ou execute funções administrativas em seu serviço. Seu aplicativo administrativo pode ser usado para definir e ler as entradas do registro ou as configurações do arquivo de configuração que seu serviço usa, etc.

Basicamente, qualquer outra coisa que você faça além do que acabei de descrever acima é fazer errado (TM) , IMHO.

Mas, para completar, vamos explorar algumas das maneiras pelas quais você pode fazer algo errado, mas ainda assim, tecnicamente, conseguir o que você quer.

Say there is a problem and the server is restarted unexpectedly, I should not have to login for it to start. Is there some way to do this?

Claro. Faça o executável ser executado na inicialização colocando-o em HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run . (Desculpe, é para o login do usuário.) Ou coloque-o em uma tarefa agendada que esteja configurada para ser executada na inicialização do sistema. (É claro que, se você for na rota do Serviço do Windows, basta definir seu serviço como Automático no Service Controller.)

say the application crashes, is there a way to make the OS close the crashed executable and restart it?

Isso não faz sentido. Se o processo ainda estiver em execução, ele não travou. Se ele <> pendurou por causa de algo que você fez de errado em seu código, por exemplo, falta de tratamento de exceções, isso é algo que você precisa corrigir em seu código.

Por outro lado, se você quisesse executar um script a cada 5 minutos (através do Agendador de Tarefas) que verificasse se FunGame.exe estava em execução ou não e iniciá-lo se não estivesse em execução, então você está livre para faça isso ... embora eu odeie você se você rodasse algo assim em um dos meus servidores.

In addition, when I do login as administrator, if I could see it running, that would be awesome too. (wg: visible console window)

Não vai acontecer - a menos que você aceite meu conselho sobre como fazer um aplicativo separado que foi especificamente projetado para ser uma interface de administração / monitoramento em seu serviço, então você pode colocar esse aplicativo na inicialização do Administrador pasta, etc.

Ah, e uma última coisa ... também há srvany.exe ... é antigo e não é suportado, mas você pode querer examiná-lo como um host de serviço genérico se não for fazer seu próprio serviço.

    
por 14.12.2013 / 19:34
1

Estou assumindo que seu aplicativo é um aplicativo de linha de comando, desde que você mencionou a janela do console.

Se for esse o caso, você pode iniciá-lo a partir de um arquivo em lote, assim:

:top
the_game_server.exe
goto top

Eu acho que mesmo que não seja um aplicativo de linha de comando que teoricamente funcionaria bem.

Conseguir que o aplicativo sobreviva a uma falha pode ser mais complicado. Depende do que acontece quando ele trava. Por exemplo, o Windows pode exibir uma caixa de diálogo modal informando que o aplicativo disse ao tempo de execução para abortar de uma maneira incomum ou algo assim. Se você precisar de alguma maneira de clicar no botão de diálogo, o AutoHotkey provavelmente é uma boa escolha.

Esta não é uma solução tão elegante quanto criar um serviço. Isso é mais do que eu faria se a fonte do aplicativo não estivesse disponível, e eu só precisava fazer isso funcionar.

    
por 29.09.2014 / 14:52