2015-10-16 5 views
1

Я пытаюсь сделать бесконечный цикл, чтобы проверить, использует ли node.exe по некоторому количеству памяти. Как это:Перерыв бесконечный цикл с taskkill

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

Но как я могу разорвать этот бесконечный цикл, когда taskkill обрабатывается?

+0

ли 'taskkill' множество ERRORLEVEL, когда условие выполнено или не встречались? – lit

+0

Нет, как я могу это сделать? Я пытаюсь понять, как реализовать это [link] (http://www.robvanderwoude.com/condexec.php) – jdscardoso

+1

Вы можете использовать 'tasklist/FI 'IMAGENAME eq ADTConsole.exe", чтобы увидеть, если изображение все еще запущено , Но это не поможет, если у вас могут быть другие изображения, которые вы не хотите убивать. – lit

ответ

1
: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)

+0

Я бы изменил 'find 'PID' 'to' find "УСПЕХ" '. «PID» выводится, даже если «taskkill» не работает. –

+0

@DmitrySokolov, 'SUCESS' зависит от локали, а' PID' - нет, и вопрос (по крайней мере, как это было сделано) не требует разницы между успехом или сбоем в работе или что делать, если более одного процесса и некоторые могут быть убиты, а некоторые нет. В любом случае, спасибо, еще один вариант OP. –

+0

Вы правы - 'taskkill' выдает сообщение, зависящее от локали. Но, например, в ru-RU locale нет слова 'PID' в сообщении' taskkill' - Ошибка: Не удается завершить процесс «PING.EXE» с идентификатором 10536. Причина: Отказано в доступе. –

0

Другим подходом было бы использовать 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 
1

Работы для меня, для любого региона.

: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 
) 
0
taskkill /IM node.exe /FI "memusage gt 85000" |find "SUCCESS" &&GOTO :BREAKOUT 
2
set "Myprocess=node.exe" 
:test 
tasklist | find /i "%MyProcess%">nul && Taskkill /F /IM "%MyProcess%" & exit/b 
timeout /t 30 
goto:test