Прекъснете безкрайния цикъл с taskkill

Опитвам се да направя безкраен цикъл, за да проверя дали node.exe използва повече от определен брой памет. Като този:

:loop2
sleep
taskkill /f /im node.exe "memusage gt 85000" > nul
timeout /t 30
GOTO loop2

Но как мога да прекъсна този безкраен цикъл, когато taskkill се обработва?


person jdscardoso    schedule 16.10.2015    source източник
comment
taskkill задава ли ERRORLEVEL, когато условието е изпълнено или не?   -  person lit    schedule 16.10.2015
comment
Не, как мога да го направя? Опитвам се да разбера как внедрявам тази връзка   -  person jdscardoso    schedule 16.10.2015
comment
Можете да използвате tasklist /FI "IMAGENAME eq ADTConsole.exe", за да видите дали дадено изображение все още работи. Но това няма да помогне, ако можете да имате други изображения, които не искате да убиете.   -  person lit    schedule 16.10.2015
comment
Възможен дубликат на stackoverflow.com/questions/23330273/   -  person SachaDee    schedule 18.10.2015


Отговори (3)


:loop2
    sleep
    ( taskkill /f /im node.exe /fi "memusage gt 85000" | find "PID" >nul ) || (
        timeout /t 30
        GOTO loop2
    )

Проверете изхода на командата, за да определите дали даден процес е бил убит.

Редактирано Мислех, че низът PID е независим от локала, но не е така. Ако е необходимо, командата find може да бъде заменена с

find /i "node.exe" > nul

за търсене на името на процеса в изхода, или

findstr /r /c:" [1-9][0-9]*[02468][\., ]" > nul

за търсене на наличие на идентификатор на процес (забележка: всички идентификатори на процеси са кратни на 4)

person MC ND    schedule 16.10.2015
comment
Бих променил find "PID" на find "SUCCESS". PID се извежда дори ако taskkill е неуспешно. - person Dmitry Sokolov; 16.10.2015
comment
@DmitrySokolov, SUCESS зависи от локала, докато PID не е и въпросът (поне както е направено) не изисква разлика между успех или неуспех в операцията или какво да се направи, ако се намери повече от един процес и някои могат да бъдат убити, а някои не. Както и да е, благодаря, още една опция към OP. - person MC ND; 16.10.2015
comment
Прав си - taskkill издава съобщение, което зависи от локала. Но, например, в ru-RU локал няма дума PID в taskkill съобщение - Ошибка: Не се удава да завърши процес PING.EXE с идентификатор 10536. Причина: Отказано в достъпа. - person Dmitry Sokolov; 17.10.2015
comment
И това е успешен резултат - Успешно: Процесът PING.EXE, с идентификатор 8568, е завършен. - person Dmitry Sokolov; 17.10.2015
comment
@DmitrySokolov, потърсих резултат от командата taskkill и трябва да призная, че това ме убеди. Моя грешка. Единственият независим от локала начин да го направите, който виждам в този момент, е да проверя за наличието на идентификационен номер на процес или името на процеса, който да убиете. - person MC ND; 17.10.2015
comment
Друг метод е да използвате chcp в началото на скрипта, например chcp 65001 работи за мен (всички съобщения се извеждат на английски, така че find работи правилно). - person Dmitry Sokolov; 17.10.2015
comment
@DmitrySokolov, За първи път виждам препратка към това. В моя случай, работейки във версия на windows на испански локал, промяната на кода на страницата не засяга изходния език, а само набора от знаци, показан в конзолата. Може би работи във вашия локал, но мисля (може би греша, разбира се), че chcp не е надеждно решение. - person MC ND; 17.10.2015

Работи за мен, за всеки локал.

:loop2
sleep
set _tk=
for /f "skip=1 delims=, tokens=2" %%A in ('tasklist /fi "imagename eq node.exe" /fi "memusage gt 85000" /fo csv') do (
    taskkill /f /pid %%~A
    set _tk=1
)
if not "%_tk%"=="1" (
    timeout /t 30
    GOTO loop2
)
person Dmitry Sokolov    schedule 16.10.2015

Друг подход би бил да използвате TASKLIST, за да видите дали се изпълнява съвпадащо изображение. Този код -не- е тестван.

:loop2

SET TEMPFILE=%TEMP%\tk_%RANDOM%.tmp

TASKLIST /FI "IMAGENAME eq cmd.exe" /FI "MEMUSAGE gt 9000" >"%TEMPFILE%"
SET /P TKI=<"%TEMPFILE%"
IF "%TKI%" EQU "INFO: No tasks are running which match the specified criteria." (GOTO OutOfIt)

taskkill /f /im node.exe "memusage gt 85000" > nul
timeout /t 30
GOTO loop2

:OutOfIt
IF EXISTS "%TEMPFILE%" (DEL "%TEMPFILE%")
EXIT /B
person lit    schedule 16.10.2015