2016-10-24 4 views
0

У меня есть пакетный файл, который загружает 21 отдельный файл (все очень большие). У меня есть тайм-ауты, чтобы попытаться разрешить некоторые файлы завершить, прежде чем пытаться получить больше (не очень хорошее решение), и если все они работают вместе, то все мои системные ресурсы и все прерываются.Ограниченное количество пакетных файлов, запущенных циклом FOR

Я могу положить/ПОДРОБНО в мой цикл FOR, тогда он будет запускать только одну задачу загрузки за раз. Я хотел бы запустить 5 загрузочных окон, и как только они закончатся, переходите к следующему 5. Я пытался использовать GOTO, чтобы дождаться окончания, но он не работает.

rem *****Step 1***** 
set tstart=0 
set tend=5 
set incr=1 
FOR /L %%a IN (%tstart%,%incr%,%tend%) DO (start /ABOVENORMAL GET_PIECE_ENSEMBLE.bat %newformatdate% 0%%a %HH%) 
timeout /t 30 

:WAIT 
if exist flagfile.* goto WAIT 

Тогда у меня есть еще 4 шага для загрузки файлов 5-10, 11-16 и т.д. Но если это займет удлиненным скачать, скрипт двигается и начинает загружать несколько файлов или двигаются к следующему процессов, которые требуют, чтобы все данные сначала загружались. Я пробую здесь 2 вещи: короткий тайм-аут, чтобы обеспечить загрузку данных (поэтому существует файл флага) и ждать, если флаг существует. Но ожидание не работает, скрипт продолжает двигаться и начинает загрузку следующей группы. Моим обходным решением было установить тайм-аут 600, но иногда загрузка данных занимает более 10 минут, иногда она зависает и занимает до двух часов, иногда всего несколько минут. Если все части запускаются сразу, это замерзает рабочую станцию, и мы должны перезапустить машину.

А вот код GET_PIECE_ENSEMBLE, скрипт, который работает в цикл:

set "newformatdate=%1" 
set "ename=%2" 
set "HH=%3" 
echo %time% > flagfile.%ename% 
wget -O C:/Data/DataFile_%HH%.%ename%.grb2 http://url/%newformatdate%.grib2 
del flagfile.%ename% 

Глядя за советом либо как сделать «ждать, если flagfile существует» работа (любая идея, почему это ISN 't working?), или если есть какой-то простой аргумент, я могу включить в цикл FOR цикл, чтобы ограничить количество экземпляров, поэтому загрузка заканчивается до того, как другие начнут? Разумеется, есть лучшее решение, чем угадать в тайм-аут, когда сетевые условия меняются так сильно!

+0

Таким образом, вместо того, чтобы в любой момент времени работать не более, чем пять, вы хотите подождать до полного набора из пяти окон до перехода к следующему набору из пяти? – SomethingDark

+0

В любом случае, я просто хочу запустить более одного (использовать пропускную способность), но не все 21 из них, потому что это слишком много, все они идут очень медленно и сбой рабочей станции. –

ответ

0

В GET_PIECE_ENSEMBLE

попробовать

... 
set "HH=%3" 
:only5 
set /a running=0 
for /f %%c in ('dir /b/a-d flagfile.* 2^>nul') do set /a running+=1 
if %running% geq 5 (
timeout /t 1 >nul 
goto only5 
) 
echo %time% > flagfile.%ename% 
... 

, который должен рассчитывать на flagfiles и пока есть 5 или более, задержка 1 сек.

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

+0

Все 21 запуск окон сразу же, поскольку файл флага не создается до тех пор, пока не будет выполнено соединение для загрузки, которое занимает несколько секунд. –

+0

Я бы согласился, что все 21 запущены, но файл флагов должен быть создан до выполнения 'wget', поэтому только 5' wget 'должны выполняться параллельно. Я не понимаю, почему файл флага не создается до тех пор, пока не будет сделано соединение для загрузки. Он должен быть сгенерирован до запуска 'wget'. Пожалуйста объясните далее. – Magoo

0

UNTESTED !!!

:: Start with list of files to download as parameters 
:: down.cmd "file1" "file2" "file3" etc.. 
@echo off 
set "url=http://host.com" 
:loop 
for /f %%a in ('tasklist /FI "imagename eq wget.exe" /FI "windowtitle eq _download*" /FO csv /NH ^| find /C "wget"') do (
if %%a LEQ 5 (
      start "_download" "%path%\wget.exe" -O "%~1" "%url%/%~1" 
      shift 
      ) 
timeout /T 5 
if not "%~1"=="" goto loop 
Смежные вопросы