Иногда не работает отложенная итерация в пакетном файле - PullRequest
0 голосов
/ 25 мая 2020

У меня есть пакетный сценарий Windows, который запускает исполняемую программу в al oop, и в зависимости от кода выхода он должен подождать 10 секунд перед перезапуском исполняемого файла. Это отлично работает, если я завершаю исполняемый файл с помощью диспетчера задач, но не работает в других случаях.

Пакетный сценарий выглядит следующим образом:

@ECHO OFF
.\timeout.exe 1

SET myprogramcmdversion=3
SET MYPROGRAM_RUN_CMD=.\MyProgramExe.exe

ECHO %date% %time%   myprogram.cmd   Batch file start, version %myprogramcmdversion% >> Logs\myprogram_cmd.txt

:loop_start
    ECHO %date% %time%   myprogram.cmd   Start program loop >> Logs\myprogram_cmd.txt

    START /WAIT /B %MYPROGRAM_RUN_CMD%
    ECHO %date% %time%   myprogram.cmd   Exit code: %errorlevel% >> Logs\myprogram_cmd.txt

    :: MyProgramExe uses exit codes 20000 - 20999 or 0, anything else is a Windows exit code.
    :: The 1 in front of each operand handles the case where %errorlevel% is undefined
    IF /I 1%errorlevel% GEQ 120000 (
        IF /I 1%errorlevel% LEQ 120999 (
            GOTO loop_continue
        )           
    )
    IF /I "%errorlevel%" NEQ "0" (
        ECHO %date% %time%   myprogram.cmd   Unhandled exit code, waiting 10 seconds before restarting MyProgramExe >> Logs\myprogram_cmd.txt
        .\timeout.exe 10
    )

    :loop_continue
:: Exit code 20999 can be used by MyProgramExe to stop the launcher loop.
IF /I "%errorlevel%" NEQ "20999" GOTO loop_start

:loop_exit
ECHO %date% %time%   myprogram.cmd   Batch file stop >> Logs\myprogram_cmd.txt

Если код выхода MyProgramExe.exe - это что угодно кроме 20000 - 20999 или 0, timeout.exe должен задержать следующую итерацию на 10 секунд. Обратите внимание, что я скопировал системный timeout.exe в локальный каталог после того, как прочитал, что иногда он может выйти из строя, если запустить его просто с помощью timeout «команды». Но, по-видимому, иногда это все равно не удается.

При просмотре файлов журнала я заметил, что машина была перезапущена из-за обновления 14 мая, и в этот момент MyProgramExe.exe был прерван с помощью «unhandled "код выхода, но все равно не было задержки до следующего запуска.

2020-05-14  0:33:01,56   myprogram.cmd   Exit code: 1073807364 
2020-05-14  0:33:01,58   myprogram.cmd   Unhandled exit code, waiting 10 seconds before restarting MyProgramExe
2020-05-14  0:33:01,61   myprogram.cmd   Start program loop 
2020-05-14  0:33:01,90   myprogram.cmd   Exit code: -1073741205 
2020-05-14  0:33:01,92   myprogram.cmd   Unhandled exit code, waiting 10 seconds before restarting MyProgramExe 
2020-05-14  0:33:01,93   myprogram.cmd   Start program loop 
2020-05-14  0:33:01,95   myprogram.cmd   Exit code: -1073741205 
2020-05-14  0:33:01,95   myprogram.cmd   Unhandled exit code, waiting 10 seconds before restarting MyProgramExe 
2020-05-14  0:33:01,97   myprogram.cmd   Start program loop 
2020-05-14  0:33:01,98   myprogram.cmd   Exit code: -1073741205 
2020-05-14  0:34:28,14   myprogram.cmd   Batch file start, version 3 
2020-05-14  0:34:28,16   myprogram.cmd   Start program loop 

Глядя в системный журнал Windows, кажется, что User32 инициировал перезагрузку с 00:33:01. В этот момент средство запуска пакетных файлов l oop перезапускает исполняемый файл 3 раза без задержки.

С другой стороны, если я использую диспетчер задач для завершения MyProgramExe.exe, он работает, как ожидалось ( обратите внимание на разницу во времени, 14:25:16 - 14:25:26):

2020-05-25 14:25:16,71   myprogram.cmd   Exit code: 1 
2020-05-25 14:25:16,72   myprogram.cmd   Unhandled exit code, waiting 10 seconds before restarting MyProgramExe 
2020-05-25 14:25:26,11   myprogram.cmd   Start program loop 

Моя теория состоит в том, что запуск timeout.exe предотвращен системой, потому что она находится в процессе завершения работы и перезагрузки, может ли это быть так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...