Разорвать бесконечный цикл с помощью 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 - нет, и вопрос (по крайней мере, как это было сделано) не требует разницы между успехом или неудачей в операции или что делать, если обнаружено более одного процесса, и некоторые из них могут быть убиты, а некоторые нет. В любом случае, спасибо, еще один вариант ОП. - 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