2014-09-16 3 views
1

Редактировать: Я обновил свой вопрос и код.taskkill условно на время выполнения процесса (таймаут)

Я запускаю скрипт python (по сотням файлов) из пакетного файла. Проблема в том, что скрипт python для некоторых файлов занимает много времени для запуска. Я хочу, чтобы мой скрипт python не запускался более 5 минут в одном файле. Если это займет более 5 минут, я просто хочу убить мой скрипт и перейти к следующему файлу, как написано в моем командном файле ниже.

Я хочу, чтобы определить 300 секунд как максимальное время, которое мой код может потратить на один файл. Если это занимает более 300 секунд, пакетный файл должен его убить. Однако, когда требуется меньше 300 секунд, он не должен ждать 300 секунд, а должен немедленно перейти к следующему утверждению.

@echo off 
setlocal enableextensions disabledelayedexpansion 

echo FILE NO: 1 
rem filename1 is not a variable name but the name of the file itself 
start "Python" python "Code.py" filename1 var1 & call :timeoutProcess "python.exe" 300 
start "Python" python "Code.py" filename1 var2 & call :timeoutProcess "python.exe" 300 
echo FILE NO: 2 
start "Python" python "Code.py" filename2 var1 & call :timeoutProcess "python.exe" 300 
start "Python" python "Code.py" filename2 var2 & call :timeoutProcess "python.exe" 300 
echo FILE NO: 3 
start "Python" python "Code.py" filename3 var1 & call :timeoutProcess "python.exe" 300 
start "Python" python "Code.py" filename3 var2 & call :timeoutProcess "python.exe" 300 
echo FILE NO: 4 
start "Python" python "Code.py" filename4 var1 & call :timeoutProcess "python.exe" 300 
start "Python" python "Code.py" filename4 var2 & call :timeoutProcess "python.exe" 300 
echo FILE NO: 5 
start "Python" python "Code.py" filename5 var1 & call :timeoutProcess "python.exe" 300 
start "Python" python "Code.py" filename5 var2 & call :timeoutProcess "python.exe" 300 
. 
. 
. 
. 
. 
. 
. 
echo FILE NO: 200 
start "Python" python "Code.py" filename200 var1 & call :timeoutProcess "python.exe" 300 
start "Python" python "Code.py" filename200 var2 & call :timeoutProcess "python.exe" 300 

exit /b 

:timeoutProcess process timeout [leave] 
rem process = name of process to monitor 
rem timeout = timeout in seconds to wait for process to end 
rem leave = 1 if process should not be killed on timeout 
for /l %%t in (1 1 %~2) do ( 
    timeout /t 1 >nul 
    tasklist | find /i "%~1" >nul || exit /b 0 
) 
if not "%~3"=="1" taskkill /f /im "%~1" >nul 
exit /b 1 

Этот код отлично работает, если я запустил его до имени файла5. Однако, когда я запустил его до файла filename200, этот код работает только для имени файла1 и сразу переходит к filename13, а затем filename170. Я не могу понять эту проблему. Кажется, что нет синтаксической ошибки.

Я новичок в написании пакетных файлов. Просьба помочь в решении этой проблемы. Если у вас есть лучшая альтернатива для решения этой проблемы (вместо таймаута), пожалуйста, дайте мне знать.

P.S .: Я также попытался использовать функцию тайм-аута в Python из пакета Eventlet, но эта функция не работает должным образом в моих файлах, и поэтому я решил попробовать тайм-аут из пакетного файла. Я работаю на Windows-машине и с помощью Python 2.7.

ответ

1

Возможно, самый простой способ - проверить петлю, завершился ли процесс. Если процесс завершается, оставьте цикл. Если цикл заканчивается, убить процесс

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    start "" python "E:\Code1.py" 
    call :timeoutProcess "python.exe" 300 

    start "" python "E:\Code2.py" 
    call :timeoutProcess "python.exe" 300 

    exit /b 

:timeoutProcess process timeout [leave] 
    rem process = name of process to monitor 
    rem timeout = timeout in seconds to wait for process to end 
    rem leave = 1 if process should not be killed on timeout 
    for /l %%t in (1 1 %~2) do (
     timeout /t 1 >nul 
     tasklist | find /i "%~1" >nul || exit /b 0 
    ) 
    if not "%~3"=="1" taskkill /f /im "%~1" >nul 2>nul 
    if %errorlevel% equ 128 (exit /b 0) else (exit /b 1) 

(код адаптированный из previous answer)

+0

Спасибо большое. Это прекрасно работает. – Ankit

+0

@ Ankit, у меня нет под рукой python для тестирования, но с другими скриптовыми механизмами это работает. Это также не работает, если команды 'start' и' call' находятся в отдельных строках или только с конкатенированными командами? –

+0

@Ankit, пожалуйста, включите проблемный код в вопрос или запустите новый вопрос. Не видя этого, трудно определить причину неудачи. –