Redémarrer automatiquement l'application à la fermeture


10

J'ai une application serveur que je veux exécuter chaque fois que l'ordinateur est en cours d'exécution et généralement c'est le cas, sauf que parfois je la trouverai fermée d'elle-même.

Y a-t-il une batte ou un script que je peux exécuter pour surveiller l'application et la redémarrer si elle se ferme?


Quel type d'application et comment démarre-t-elle normalement? En tant que service, dans le registre en tant que commande d'exécution ou dans le dossier de démarrage?
KCotreau

Commande d'exécution du registre. avec l'option '-start'.
Sid

Que se passe-t-il actuellement si vous réexécutez cette commande avec l'application déjà en cours d'exécution?
KCotreau

rien. La commande reconnaît que l'application est déjà en cours d'exécution.
Sid

Réponses:


12

Cela ne fonctionne pas toujours (cela dépend en quelque sorte de la façon dont le programme se charge), mais normalement vous pouvez créer un fichier batch comme celui-ci:

@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

J'ai utilisé le Bloc-notes comme exemple.

Les lignes

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

sont juste un délai (de 10 secondes) pour donner à l'utilisateur la possibilité d'interrompre le processus avant qu'il ne redémarre.

La ligne

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

n'est pas nécessaire, mais se connecterait chaque fois que le programme était fermé dans un fichier, il pourrait donc être utile de diagnostiquer le problème. Le niveau d'erreur peut ne pas vous en dire beaucoup, mais un programme est censé renvoyer 0 s'il s'est fermé normalement, et un non -message zéro si ce n'est pas le cas

Remarque, vous mentionnez que votre programme ne fait rien s'il est déjà en cours d'exécution. Cela signifie généralement que l'application démarre, détecte qu'une autre copie est déjà en cours d'exécution et s'arrête immédiatement. Si tel est le cas, et que votre programme est en cours d'exécution avant de démarrer ce fichier de commandes, le lot effectuera une boucle et tentera de démarrer votre programme toutes les dix secondes.


"alors le lot tournera en boucle et tentera de démarrer votre programme toutes les dix secondes." Est-ce une mauvaise chose?
posfan12

Merci!! Un petit copier-coller à 12h52, et je peux m'endormir sans (trop) m'inquiéter de ce que je trouverai (ou ne trouverai pas) le matin. Euh. le matin après le sommeil.
Spike0xff

2

Sur la base de vos réponses ci-dessus, ce que je suggère, c'est de mettre cette commande dans un fichier de commandes, puis de définir ce fichier de commandes pour qu'il s'exécute en tant que tâche planifiée toutes les minutes. Il n'y a pratiquement pas de frais généraux associés à cela, et cela garantit que votre processus est déclaré, que vous soyez là ou non pour réaliser qu'il s'est arrêté.


Cela me semble être une solution plutôt maladroite et inefficace, bien que rapide. Existe-t-il peut-être un moyen plus approprié pour atteindre le même but? Merci de votre aide!!!
Sid

Sid, comme je l'ai dit, les frais généraux sont TRÈS minimes et c'est FACILE à faire. Si vous voulez trouver un moyen de coder quelque chose à vérifier pour voir s'il fonctionne, puis pour le redémarrer, n'hésitez pas, mais je le fais depuis longtemps avec des résultats positifs. Il s'agit d'une méthode courante utilisée lorsque vous avez des applications, généralement sur un serveur, qui cessent de fonctionner.
KCotreau

De loin la méthode la plus simple. Et il n'y a pas de frais généraux.
surfasb

2

Je suppose que la bonne réponse à cette question dépend de la raison pour laquelle vous voulez le faire. Essayez-vous de résoudre un arrêt accidentel? Empêcher un arrêt non intentionnel "malveillant" par les utilisateurs de la machine (par exemple, les employés qui ferment le logiciel de surveillance)? Empêcher les attaques malveillantes sérieuses et qualifiées? Essayez-vous d'écrire vous-même des logiciels malveillants (auquel cas veuillez vous débarrasser de;))?

En outre, comme d'autres commentateurs l'ont mentionné, cela différerait si vous aviez écrit un service Windows (par exemple)

Personnellement, je commencerais probablement par écrire une deuxième application et la démarrer de la même manière. Demandez aux deux applications de numérisation pour l'autre périodiquement et redémarrer si nécessaire - assurez-vous fournir un moyen facile pour l'application à légitimement fermée si!

Cela dit, et compte tenu de votre commentaire "parfois, je trouverai qu'il a fermé par lui-même", je commencerais vraiment par essayer de savoir pourquoi il est fermé ...


J'utilise l'ordinateur comme serveur multimédia et l'application incriminée est mediaserver.exe. Rien de malveillant à ce sujet. Je ne peux pas prévoir de scénario dans lequel je voudrais que l'application soit fermée, mais si je le devais, il n'y aurait aucune raison pour laquelle je ne pourrais pas arrêter le script ou la batte en premier. De plus, je ne suis pas capable d'écrire des logiciels, mais je connais bien les fichiers de chauves-souris. c'est à dire que je suis un noob.
Sid

Toutes mes excuses - ce serait moi pensant que j'étais dans le groupe « programmeurs » et que vous aviez écrit l'application vous :-) Clumsy que cela puisse paraître , je vous suggère l'approche « tâche planifiée » décrite par @KCotreau
Steve Mallam

2

Vous pouvez utiliser un programme appelé ReStartMe 2.0 [ Mirror ] fait exactement cela:

Surveille les processus et les redémarre s'ils se ferment.


-1

c'est bien mieux! ceci est un code que j'utilise pour un serveur de jeu minetest devrait être enregistré sur un fichier .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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.