2016-10-24 3 views
0

21 개의 별도 파일 (모두 매우 큰 파일)을 다운로드하는 배치 파일이 있습니다. 일부 파일을 더 좋은 (좋은 해결책이 아닌) 얻으려고하기 전에 끝내기 위해 시간 초과가 있습니다. 그리고 모두 함께 실행하면 모든 시스템 리소스를 사용하고 모든 것이 중단됩니다.FOR 루프에서 시작한 배치 파일의 수 제한

FOR 루프에/WAIT을 넣을 수 있습니다. 그러면 한 번에 하나의 다운로드 작업 만 시작됩니다. 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 

그럼 난 등 파일 5-10, 11-16, 다운로드 할 수있는 4 개의 단계를하지만 다운로드 여분의 긴 걸리는 경우, 스크립트는 다음에에 더 많은 파일 또는 이동 다운로드를 따라 이동하고 시작 프로세스는 모든 데이터를 먼저 다운로드해야합니다. 나는 여기에 2 가지 일을 시도하고있다 : 데이터가 다운로드되기 시작하기위한 짧은 시간 제한 (flagfile이 존재하기 때문에)과 flagfile이 존재하면 기다린다. 그러나 기다림이 효과가 없으면 스크립트는 계속 움직여 다음 무리를 다운로드하기 시작합니다. 제 해결 방법은 시간 제한을 600으로 설정하는 것이었지만 때로는 데이터를 다운로드하는 데 10 분 이상 걸리는 경우가 있었으며 때로는 중지되고 최대 2 시간, 때로는 불과 몇 분이 걸리는 경우도있었습니다. 한번에 모든 조각이 나오면 워크 스테이션이 멈추고 기계를 다시 시작해야합니다.

그리고 여기가 GET_PIECE_ENSEMBLE의 코드를 for 루프에서 실행되는 스크립트입니다에 대한 조언을 찾고

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 루프에 인스턴스 수를 제한하여 다른 사람들이 시작하기 전에 다운로드가 끝나도록 할 수 있습니까? 분명히 시간 초과 간격으로 추측하는 것보다 나은 솔루션이 있습니다.

GET_PIECE_ENSEMBLE

에서

+0

그래서 그 대신, 다섯의 다음 세트로 이동하기 전에 오 명 마감의 완전한 세트까지 기다려야 할 주어진 시간에 다섯 개 실행보다는 더 이상없는의? – SomethingDark

+0

어느 쪽이든, 나는 단지 하나 이상을 (대역폭을 활용하기 위해) 발사하기를 원한다. 그러나 그것들 모두 21 개가 너무 많아서, 모두 매우 느리게 진행되고 워크 스테이션이 충돌하기 때문에 발사하기를 원한다. –

답변

0

는 flagfiles 계산한다

... 
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% 
... 

시도 5 이상이있는 반면, 1 초 지연.

플래그 파일 하나가 삭제 되 자마자 활성화 된 다음 대기중인 파일은 처리중인 파일의 수를 다시 5로 늘려 다른 대기중인 프로세스를 차단합니다.

+0

플래그 파일은 다운로드 연결이 완료 될 때까지 생성되지 않으므로 한 번에 21 개의 모든 창이 열립니다. 몇 초가 소요됩니다. –

+0

나는 21 개가 모두 시작된다는 것에 동의하지만,'wget'이 실행되기 전에 flagfile이 만들어 져야하므로 5 개의'wget' 만 병렬로 실행되어야합니다. 다운로드 연결이 만들어 질 때까지 flagfile이 생성되지 않는 이유를 모르겠습니다. 그것은 * 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 
관련 문제