Redémarrage automatique de l'exécutable après le blocage de l'application [Windows]

1

Création d'une application autonome pour un kiosque devant être opérationnel 24 7.

Dans les rares cas où l'application se bloque, j'ai besoin d'un moyen de le faire redémarrer automatiquement. J'utilise Windows 10 sur un Nuc.

Les experts de Windows peuvent-ils suggérer le meilleur moyen d’y parvenir?

Bachalo
la source
Une autre option pourrait être de créer un service de l'application. Un service peut être configuré pour redémarrer 3 fois. Ceci éliminera une fenêtre d'invite de commande pouvant être fermée par n'importe qui. C'est plus difficile à installer cependant ...
LPChip

Réponses:

2

Une solution consiste à utiliser un fichier de commandes avec une forboucle infinie pour redémarrer automatiquement l'application si elle se ferme. Il y a deux possibilités ici, en fonction de la conception de l'application.

Si l'application est lancée et s'exécute dans le même processus, vous pouvez utiliser un fichier de commandes très simple:

@echo off
:Start
C:\path\to\application.exe
:: Wait 30 seconds before restarting.
TIMEOUT /T 30
GOTO:Start

Cela fonctionnera indéfiniment. Chaque fois que application.exese ferme ou se bloque, le fichier de commandes le redémarre.

Cela ne fonctionnera pas si se application.exelance subapp.exepuis se application.exeferme. Dans ce cas, vous auriez besoin de quelque chose de plus compliqué.

@ECHO off
SET _PollingInterval=30

:BatchStart
C:\path\to\application.exe

:Start
:: Uncomment the following line on versions of Windows prior to Windows 7 and comment out the TIMEOUT line. The PING solution will not be 100% accurate with _PolingInterval.
:: PING 127.0.0.1 -n %_PollingInterval% >nul
TIMEOUT /T %_PollingInterval%

SET PID=
FOR /F "tokens=2 delims= " %%i IN ('TASKLIST ^| FIND /i "subapp.exe"') DO SET PID=%%i
IF [%PID%]==[] (
    ECHO Application was not running. Restarting script.
    GOTO BatchStart
)
GOTO Start

GOTO:EOF

Si votre application peut avoir plusieurs processus, vous pouvez probablement utiliser quelque chose comme à la FINDSTR /i "subapp.exe application.exe"place de FIND /i "subapp.exe", mais cela ne fonctionnerait pas pour les processus avec des espaces dans leur nom car ils FINDSTRutilisent l'espace comme un suppresseur.

Pour arrêter ces fichiers de commandes une fois qu’ils ont été démarrés, laissez l’application ouverte et passez à l’invite de commande. Ensuite, utilisez Ctrl+ Cet confirmez que vous souhaitez mettre fin au script. Une fois le script terminé, fermez l'application.

Lectures complémentaires:

Worthwelle
la source
Merci! Une petite question: comment puis-je ajouter un délai à la solution la plus simple (1ère) afin que l'application ne redémarre pas immédiatement?
Bachalo
Vous pouvez utiliser la TIMEOUTcommande. Je l'ai ajouté à l'exemple dans la réponse.
Worthwelle