Reiniciar automaticamente o aplicativo quando fechar

10

Eu tenho um aplicativo de servidor que desejo executar sempre que o computador estiver em execução e, geralmente, esse é o caso, exceto às vezes, acho que ele foi fechado por si só.

Existe um bastão ou script que eu possa executar para monitorar o aplicativo e reiniciá-lo, caso seja fechado?

Sid
fonte
Que tipo de aplicativo e como ele normalmente é iniciado? Como um serviço, no registro como um comando de execução ou na pasta de inicialização?
KCotreau
Comando de execução do registro. com a opção '-start'.
Sid
O que acontece atualmente se você executar esse comando novamente com o aplicativo já em execução?
KCotreau
nada. O comando reconhece que o aplicativo já está em execução.
Sid

Respostas:

12

Isso nem sempre funciona (depende da forma como o programa se carrega), mas normalmente você pode criar um arquivo em lotes como este:

@Echo off
:Start
NotePad
echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log 
echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost

goto Start

Eu usei o bloco de notas como um exemplo.

As linhas

echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost

são apenas um atraso (de 10 segundos) para dar ao usuário a chance de interromper o processo antes de iniciar novamente.

A linha

echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log 

não é necessário, mas seria registrado cada vez que o programa era fechado em um arquivo, portanto, pode ser útil diagnosticar o problema. O ErrorLevel pode não lhe dizer muito, mas um programa deve retornar 0 se for fechado normalmente e não mensagem zero se isso não acontecer

Observe que você mencionou que seu programa não faz nada se já estiver em execução. Isso geralmente significa que o aplicativo inicia, detecta que outra cópia já está em execução e é encerrada imediatamente. Se for esse o caso, e seu programa estiver em execução antes de iniciar esse arquivo em lotes, o lote fará um loop e tentará iniciar o programa a cada dez segundos.

sgmoore
fonte
"então o lote fará um loop e tentará iniciar seu programa a cada dez segundos." Isso é ruim?
precisa saber é o seguinte
obrigado!! Um pequeno copiar e colar às 00h52, e eu posso dormir sem (muito) me preocupar com o que vou encontrar (ou não encontrar) pela manhã. Uh na manhã pós-sono.
Spike0xff
2

Com base nas suas respostas acima, o que eu sugiro é que você coloque esse comando em um arquivo em lotes e defina esse arquivo em lote para ser executado como uma tarefa agendada a cada minuto. Não há praticamente nenhuma sobrecarga associada a isso e garante que seu processo seja declarado, independentemente de você estar por perto para perceber que ele parou.

KCotreau
fonte
Isso me parece uma solução bastante desajeitada e ineficiente, embora rápida. Existe talvez um meio mais apropriado para o mesmo fim? Obrigado pela ajuda!!!
Sid
Sid, como eu disse, a sobrecarga é MUITO mínima e é FÁCIL de fazer. Se você quiser descobrir uma maneira de codificar algo para verificar se está em execução e, em seguida, reiniciá-lo, fique à vontade, mas eu venho fazendo isso há muito tempo com resultados positivos. É um método comum usado quando você tem aplicativos, geralmente em um servidor, que param de executar.
KCotreau
De longe o método mais fácil. E não há sobrecarga.
Surfasb
2

Eu acho que a resposta certa para esta pergunta depende de por que você deseja fazer isso. Você está tentando resolver o desligamento acidental? Evitar o desligamento "malicioso" ocasional dos usuários da máquina (por exemplo, funcionários que fecham o software de monitoramento)? Evitar ataques maliciosos sérios e qualificados? Você está tentando escrever malware (nesse caso, por favor ;-))?

Além disso, como outros comentaristas mencionaram, seria diferente se você tivesse escrito um serviço do Windows (por exemplo)

Pessoalmente, eu provavelmente começaria escrevendo um segundo aplicativo e iniciando da mesma maneira. Faça com que os dois aplicativos procurem um ao outro periodicamente e reinicie, se necessário - verifique se você fornece uma maneira fácil para que o aplicativo seja legitimamente fechado!

Dito isto, e dado o seu comentário "às vezes eu acho que ele fechou por si só" Eu realmente começaria tentando descobrir por que ele está fechado ...

Steve Mallam
fonte
Uso o computador como servidor de mídia e o aplicativo incorreto é mediaserver.exe. Nada malicioso sobre isso. Não posso prever nenhum cenário em que eu gostaria que o aplicativo fosse fechado, mas, se fosse, não haveria razão para eu não poder parar o script ou rebater primeiro. Além disso, não sou capaz de escrever software, mas estou familiarizado com arquivos bat. ou seja, eu sou um noob.
Sid
Desculpas - seria eu pensando que estava no grupo "Programadores" e que você mesmo escreveu o aplicativo :-) Por mais desajeitado que eu pareça, sugiro a abordagem da "tarefa agendada" descrita por @KCotreau
Steve Mallam
2

Você pode usar um programa chamado ReStartMe 2.0 [ Mirror ] faz exatamente isso:

Monitora os processos e os reinicia se eles fecharem.

Saxtus
fonte
-1

assim é bem melhor! este é um código que eu tenho usado para um servidor de jogo minetest deve ser salvo em um arquivo .bat

@echo off
rem This is a comment line
rem This one is a comment too
rem Following line ensures the working directory is searched in C:
C:
rem Join the correct directory, where the server stuff lies in:
cd "C:\Users\morenavaj\Documents\minetest-0.4.16-win64 - Lone_Wolf\"
:love_spaghetti_code
bin\server.lnk --config minetest.conf ^
            --worldname "Land of Blockheads" ^
            --gameid minetest_game ^
            --port 30000 ^
            --logfile bin/debug.txt

echo Restarting server....
goto love_spaghetti_code

echo Done (this should never, ever, happen)
Jogos de Rottweiler
fonte