进程完成时超时或关闭



我有一个X.exe程序,大约需要2-6个小时才能完成。确切时间未知,但我想实现 6.5 或 7 小时的阈值。如果此程序在此时间内未返回任何值,则它将被终止。如何使用批处理*.bat文件实现此目的?

这是我到目前为止所拥有的:一个计时器bat1.bat和一个实际的bat2.bat.

蝙蝠1.bat:

start cmd /C bat2.bat & timeout /t 25200 & taskkill /im X.exe /f

蝙蝠2.bat:

cd blah
bat1.bat

这种方法的问题在于,只有在 25200 秒(或 7 小时)之后,计时器才会停止,并且不会在该限制之前终止。我如何告诉计算机,如果程序X.exe完成,那么不要再等待了?

任何帮助不胜感激!

我认为这是一个更简单的解决方案:

rem Start the process that will kill the X.exe program after 7 hours
start "WaitingToKill" cmd /C timeout /t 25200 ^& taskkill /im X.exe /f
rem Run the X.exe program and wait for it to terminate
X.exe
rem Kill the killer process and terminate
taskkill /fi "WINDOWTITLE eq WaitingToKill" /f

在此方法中,没有任何额外的代码同时运行;只有timeout命令的等待状态。

编辑添加了一些解释

请注意,带有 timeout 命令的"WaitingToKill"cmd.exe 进程和 X.exe 程序都是并行运行的。如果 timeout 命令在 7 小时后结束,则执行 taskkill /im X.exe /f 命令,终止X.exe程序,并且两个 cmd.exe 进程都结束。

如果 X.exe 程序在 7 小时之前结束,则批处理文件将照常执行下一行。此行是 taskkill /fi "WINDOWTITLE eq WaitingToKill" /f ,因此带有 timeout 命令的窗口被终止,并且两个 cmd.exe 进程都结束。

多亏了

@Squashman我才能自己构建脚本。 似乎工作正常

@echo off
setlocal enableextensions enabledelayedexpansion
set /a "checktime=60"
set /a "elapsedtime=0"
set /a "killtime=150"
set XProg=X.exe
start cmd /C runTest.bat 
timeout /t 10
:while1
    echo Go to WHILE loop.
    echo elapsedtime = %elapsedtime% 
    echo killtime = %killtime%
    set /a "timeleft = %killtime% - %elapsedtime%"
    echo timeleft = %timeleft%
    if /i %timeleft% geq 0 (
        tasklist /fi "imagename eq %XProg%" 2>NUL | find /i /n "%XProg%">NUL
        if "%ERRORLEVEL%"=="0" (
            echo %XProg% is still running...
        ) else (
            echo %XProg% is finished before timer.
        )
        set /a "elapsedtime = elapsedtime + checktime"
        timeout /t %checktime%
        goto :while1
    ) else (
        taskkill /im %XProg% /f
        echo %XProg% is terminated.
    )

经验 教训:1.难以批量比较数值变量(将差异与0进行比较)2. 首次elaspedtime > killtime终止(可能比killtime长一点,具体取决于检查频率)

我已经尝试了各种解决方案,但最终这在批处理中真的很麻烦。如果您愿意使用外部工具,最简单的方法是

"C:Program FilesGitusrbintimeout.exe" 5 .test.exe

正确返回测试进程的退出代码,如果您同时生成多个测试进程并且不会一直弹出窗口,它也可以工作。

相关内容

  • 没有找到相关文章

最新更新