Reiniciar automáticamente la aplicación cuando se cierra

10

Tengo una aplicación de servidor que quiero ejecutar cada vez que se ejecuta la computadora y, por lo general, este es el caso, excepto que a veces me doy cuenta de que se cerró por sí sola.

¿Hay un bat o script que pueda ejecutar para monitorear la aplicación y reiniciarla si se cierra?

Sid
fuente
¿Qué tipo de aplicación y cómo se inicia normalmente? ¿Como servicio, en el registro como comando de ejecución o en la carpeta de inicio?
KCotreau
Comando de ejecución del registro. con la opción '-start'.
Sid
¿Qué sucede actualmente si ejecuta ese comando nuevamente con la aplicación ya ejecutándose?
KCotreau
nada. El comando reconoce que la aplicación ya se está ejecutando.
Sid

Respuestas:

12

Esto no siempre funciona (depende de cómo se carga el programa), pero normalmente puede crear un archivo por 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

He usado el Bloc de notas como ejemplo.

Las líneas

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

son solo un retraso (de 10 segundos) para dar al usuario la oportunidad de abortar el proceso antes de que se inicie nuevamente.

La línea

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

no es necesario, pero registraría cada vez que el programa se cerrara a un archivo, por lo que podría ser útil diagnosticar el problema. mensaje cero si no lo hace

Tenga en cuenta que usted menciona que su programa no hace nada si ya se está ejecutando. Eso generalmente significa que la aplicación se inicia, detecta que ya se está ejecutando otra copia y se cierra de inmediato. Si ese es el caso, y su programa se está ejecutando antes de iniciar este archivo por lotes, entonces el lote se repetirá e intentará iniciar su programa cada diez segundos.

sgmoore
fuente
"entonces el lote se repetirá e intentará iniciar su programa cada diez segundos". ¿Esto es malo?
posfan12
¡¡Gracias!! Copie y pegue un poco a las 12:52 a.m., y puedo ir a dormir sin (demasiado) preocuparme por lo que encontraré (o no encontraré) en la mañana. Uh en la mañana posterior al sueño.
Spike0xff
2

Según sus respuestas anteriores, lo que sugiero es que coloque ese comando en un archivo por lotes, luego configure ese archivo por lotes para que se ejecute como una tarea programada cada minuto. Prácticamente no hay gastos generales asociados con esto, y garantiza que su proceso se establezca independientemente de si está cerca para darse cuenta de que se detuvo.

KCotreau
fuente
Esto me parece una solución bastante torpe e ineficiente, aunque rápida. ¿Existe quizás un medio más apropiado para el mismo fin? ¡¡¡Gracias por tu ayuda!!!
Sid
Sid, como dije, la sobrecarga es MUY mínima, y ​​es FÁCIL de hacer. Si desea encontrar una forma de codificar algo para verificar si se está ejecutando y luego reiniciarlo, siéntase libre, pero lo he estado haciendo durante mucho tiempo con resultados positivos. Es un método común utilizado cuando tiene aplicaciones, generalmente en un servidor, que dejan de ejecutarse.
KCotreau
Con mucho, el método más fácil. Y no hay gastos generales.
Surfasb
2

Supongo que la respuesta correcta a esta pregunta depende de por qué quieres hacerlo. ¿Estás tratando de resolver el apagado accidental? ¿Prevenir el apagado "malicioso" por parte de los usuarios de la máquina (por ejemplo, empleados que cierran el software de monitoreo)? Prevenir ataques maliciosos graves y calificados? ¿Estás intentando escribir malware tú mismo (en cuyo caso, por favor, bájate ;-))?

Además, como han mencionado otros comentaristas, sería diferente si hubiera escrito un servicio de Windows (por ejemplo)

Personalmente, probablemente comenzaría escribiendo una segunda aplicación y comenzando de la misma manera. Tienen ambas aplicaciones pueden examinar por periódicamente y reinicie si es necesario - Asegúrese de que proporciona una manera fácil para que la aplicación se cierra legítimamente sin embargo!

Dicho esto, y dado su comentario "a veces me parece que se ha cerrado por sí solo", REALMENTE comenzaría tratando de averiguar por qué está cerrado ...

Steve Mallam
fuente
Uso la computadora como servidor de medios y la aplicación infractora es mediaserver.exe. Nada malicioso al respecto. No puedo prever ningún escenario en el que me gustaría cerrar la aplicación, pero si lo hiciera, no habría razón para no poder detener el script o el bate primero. Además, no soy capaz de escribir software, pero estoy familiarizado con los archivos bat. Es decir, soy un novato.
Sid
Disculpas, ese sería yo pensando que estaba en el grupo "Programadores" y que usted mismo había escrito la aplicación :-) Torpe como suena, sugeriría el enfoque de "tarea programada" descrito por @KCotreau
Steve Mallam
2

Puede usar un programa llamado ReStartMe 2.0 [ Mirror ] hace exactamente eso:

Supervisa los procesos y los reinicia si se cierran.

Saxtus
fuente
-1

¡esto es mucho mejor! este es un código que he estado usando para un servidor de juegos minetest que debería guardarse en un archivo .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)
Juegos de Rottweiler
fuente