@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof
:loop
call :checkinstances
if %INSTANCES% LSS 5 (
rem just a dummy program that waits instead of doing useful stuff
rem but suffices for now
echo Starting processing instance for %1
start /min wait.exe 5 sec
goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping returns immediately;
rem otherwise just use an address that's unused and -n 1)
echo Waiting for instances to close ...
ping -n 2 ::1 >nul 2>&1
rem jump back to see whether we can spawn a new process now
goto loop
goto :eof
:checkinstances
rem this could probably be done better. But INSTANCES should contain the number of running instances afterwards.
for /f "usebackq" %%t in (`tasklist /fo csv /fi "imagename eq wait.exe"^|find /v /c ""`) do set INSTANCES=%%t
goto :eof
Odradza się maksymalnie cztery nowe procesy, które są wykonywane równolegle i zminimalizowane. Prawdopodobnie czas oczekiwania należy dostosować w zależności od tego, ile kosztuje każdy proces i jak długo trwa. Prawdopodobnie musisz także zmienić nazwę procesu, którego szuka lista zadań, jeśli robisz coś innego.
Jednak nie ma sposobu, aby poprawnie policzyć procesy, które są odradzane przez tę partię. Jednym ze sposobów byłoby utworzenie losowej liczby na początku partii ( %RANDOM%
) i utworzenie partii pomocniczej, która wykonuje przetwarzanie (lub spawnuje program przetwarzający), ale która może ustawić tytuł okna na parametr:
@echo off
title %1
"%2" "%3"
Byłaby to prosta partia, która ustawia swój tytuł na pierwszy parametr, a następnie uruchamia drugi parametr z trzecim jako argumentem. Następnie można filtrować listę zadań, wybierając tylko procesy o określonym tytule okna ( tasklist /fi "windowtitle eq ..."
). Powinno to działać dość niezawodnie i zapobiegać zbyt wielu fałszywym pozytywom. Wyszukiwanie cmd.exe
byłoby złym pomysłem, jeśli nadal masz uruchomione niektóre instancje, ponieważ ogranicza to pulę procesów roboczych.
Możesz użyć, %NUMBER_OF_PROCESSORS%
aby stworzyć rozsądną wartość domyślną liczby instancji do odrodzenia.
Możesz również łatwo to dostosować, aby używać psexec
do zdalnego odradzania procesów (ale nie byłoby to bardzo opłacalne, ponieważ musisz mieć uprawnienia administratora na innym komputerze, a także podać hasło w partii). Trzeba jednak użyć nazw procesów do filtrowania.