Показать полную графическую версию : Bat для запуска приложения при падении нагрузки ЦП другого процесса
Суть вопроса: есть батник запуска приложения
@echo off
start /d"C:\Program Files%\программа\1.1.0\программа.exe"
Нужно сделать чтобы при падении нагрузки ЦП на условный "процесс" менее 40%, программа стартовала заново. Знаю только как сделать при закрытии процесса
:proverka
tasklist | find "процесс.exe"
if %ERRORLEVEL% EQU 1 goto restart
if %ERRORLEVEL% EQU 0 goto vremya на какую команду заменить перечеркнутые переменные??
:vremya
timeout 3
goto proverka
:restart
start /d"C:\Program Files%\программа\1.1.0\программа.exe"
goto proverka
, а при снижении нагрузки никак найти не могу. Прошу прощения если дубль
Это надо?
Перезапуск процесса, если потребляет менее 40Мб памяти
@echo off
set "pr=programma.exe"
set "mb=40000"
cmd /c for /l %%# in () do tasklist /fi "imagename eq %pr%" /fi "memusage lt %mb%"^&^& (^>nul 2^>^&1 taskkill /f /im "%pr%"^& start "" "%pr%"^& exit /b)^& ^>nul timeout /t 1 /nobreak
pause
нет, не это. Либо нагрузка процесса на ЦП, либо общая загрузка ЦП
нагрузка процесса на ЦП, либо общая загрузка ЦП »
а как выявить точную долю процесса в загрузке ЦП, на каком-то этапе нагрузка этого процесса будет выше чем обычно, но при этом остальные процессы будут иметь очень слабую загрузку или какой-то другой появляющийся процесс может загрузить ЦП выше нужного вам предела, а ваш процесс почти бездействовать. По-моему только памятью и можно оперировать.
вот общий процент загрузки процессора:
wmic CPU get LoadPercentage /value
но что это дает, как по этому можно судить в какое время из этого числа именно нужный процесс нагрузил более чем надо?
Win32_PerfFormattedData_PerfProc_Process (но у меня не работает).
А не допускаете что процесс может просто не расходовать большое количество оперативной памяти? что 60%ЦП что 1% - расход оперативы 125мб. И как тут лезть с оперативой. Как посмотреть загрузку ЦП, и процесс я знаю. Мне нужно понять как из это сделать переменную IF. Как там будет с остальными процессами и как будет меняться в загрузке это не важно, нужна конкретная задача - запуск приложения при падении нагрузки процессом ЦП ниже 30% (или обще загрузки ЦП ниже 50
wmic CPU get LoadPercentage /value
if "LoadPercentage" gtr 24 goto 1
if "LoadPercentage" lss 24 goto 2 как сделать из этого рабочее состояние?
@echo off
for /f "delims=" %%a in ('wmic CPU get LoadPercentage /value^|find "="') do set "%%a"
cmd /c for /l %%# in () do (if "%LoadPercentage%" gtr "2" echo Больше)^& ^>nul timeout /t 1 /nobreak
pause& exit
powershell:
get-counter '\процесс(taskmgr)\% загруженности процессора'|select -exp countersamples|ft InstanceName,CookedValue
get-counter '\process(*)\% processor time'|select -exp countersamples|ft InstanceName,CookedValue
- выбор того или иного языка счетчиков зависит от системного языка.
greg zakharov
05-06-2019, 08:24
YuS_2, в cmd есть typeperf, однако ни alpap, ни вы не берете в расчет один простой нюанс касательно того, что именно подразумевается под нагрузкой ЦП в винде. Попробую объяснить популярно на пальцах. В случае с WMI оснастка возвращает последнее пиковое значение счетчика производительности, последний якобы отображает загрузку процессора в процентах. На деле же так как каждому потоку отпускается определенный квант времени, по истечении которого планировщик очереди потоков принудительно передаст управление потоку, ближе всех стоящему в очереди, логично заключить: счетчик производительности измеряет не загрузку как таковую, это - готовность планировщика предоставить управление потоку по первому требованию (всплески активности возникают при переключении потоков). Счетчики производительности предоставляются системой посредством такой NTAPI'шной функции, как NtQuerySystemInformation, при этом далеко не все из SYSTEM_INFORMATION_CLASS возвращает данные из "низов", это также справедливо и для загрузки ЦП. Иными словами, загрузка ЦП условна, и гарантированно сказать, что к всплеску привело именно такое-то приложение, а не работающее "параллельно", которое, скажем, активно использует системный таймер, невозможно (что не совсем справедливо в случае таких систем как 8.1 и 10).
greg zakharov, ни вы не берете в расчет один простой нюанс касательно того, что именно подразумевается под нагрузкой ЦП в винде. »
Григорий, вот скажите, а зачем так глубоко копать? Powershell предоставляет инструмент, я его использую...
get-counter "\процесс(*)\% загруженности процессора"|
select -exp countersamples|
ft instancename,@{n='CPU';e={($_.cookedvalue/100).tostring('P')}} -auto
по-моему, здесь конкретно написано и даже по-русски:
процесс()
% загруженности процессора
Выдает это:
get-counter -ListSet *
в соответствии с документацией.
А что там наворотила микрософт внутри WMI, мне неинтересно. Если что-то чему-то, по какой-то причине не соответствует, то это баг, который должен быть где-то описан и возможно, даже записан в очередь на исправление (что в случае с микрософт весьма сомнительно) :)
На деле же так как каждому потоку отпускается определенный квант времени, по истечении которого планировщик очереди потоков принудительно передаст управление потоку, ближе всех стоящему в очереди, логично заключить: счетчик производительности измеряет не загрузку как таковую, это - готовность планировщика предоставить управление потоку по первому требованию (всплески активности возникают при переключении потоков). »
Это в теории.
А практически, в официальной документации написано следующее:
Объект "Процесс" создается в момент запуска программы. Все потоки этого процесса используют одно и то же адресное пространство и имеют доступ к одним и тем же данным.
Почему мы не должны верить написанному?
В общем, резюмируем:
$process = 'explorer'
get-counter "\процесс($process)\% загруженности процессора" -sam 5 -cont|
select -exp countersamples|%{
if($_.cookedvalue -lt 1){
"$process ушел курить"
}else{"$process весь в работе"}
}
- прерывание скрипта по Ctrl+C
Это всё, что требовалось ТС.
загрузка ЦП условна »
бесспорно, но в данной задаче не требуются атомные точности, если я правильно понял. Такого функционала вполне должно хватить...
greg zakharov
05-06-2019, 13:22
Если что-то чему-то, по какой-то причине не соответствует, то это баг, который должен быть где-то описан и возможно, даже записан в очередь на исправлениеСледуя этой логике, Windows один сплошной баг.
Это в теории.
А практически, в официальной документации написано следующее
Увы, не теория, а факты. Ответьте, только честно, дадут вам яблоко с виду не испорченное, но заведомо гнилое внутри (при этом "угощающий" вас в курсе начинки), и скажут "это хорошее яблоко", вы поверите наслово и станете есть яблоко как есть или же, будучи прагматиком, разрежете яблоко дабы убедиться в чистоте плода? Конечно, вы можете не любить яблоки, но это для примера, чтобы пришло осознание происходящего в недрах винды. А если пример кажется притянутым за уши, можно указать на отсутствие описания многих нюансов со стороны MS в их спецификациях, как, например, в случаях с форматом LNK, PE, DOC и т.д.: нравится довольствоваться обобщениями? - дело сугубо личное.
в данной задаче не требуются атомные точности
Об этом и речи не было, если вы читали внимательно. Было указано лишь, что счетчики производительности не являются таковыми по своей природе и потому каждое из озвученных решений можно считать верным лишь в теории.
Следуя этой логике, Windows один сплошной баг. »
Ну, дык, с этим даже спорить трудно :)
Ответьте, только честно, дадут вам яблоко с виду не испорченное, но заведомо гнилое внутри (при этом "угощающий" вас в курсе начинки), и скажут "это хорошее яблоко", вы поверите наслово и станете есть яблоко как есть или же, будучи прагматиком, разрежете яблоко дабы убедиться в чистоте плода? »
Когда я покупаю в магазине яблоки, увы, я их не разрезаю, но на внешний вид смотрю, как минимум. Хоть это и не совсем подходящий пример для сравнения, но вообще мысль понятна.
Я бы подобрал такой пример:
Садясь за руль автомобиля, не каждый имеет представление о всех процессах, происходящих внутри современного двигателя, тем не менее, пользоваться автомобилем умеет каждый, кто этому обучался, т.е. для управления автомобилем совсем не обязательно изучать физику и химию происходящих процессов при работе двигателя, достаточно знать, что он работает исправно и нигде, ничего посторонних звуков не издает.
Если уж задаваться целью досконального изучения, то придется изучать устройство и структуру процессоров, их систему команд и прочее-прочее, напрямую имеющее отношение к электронике, т.е. только софтверных знаний тут будет далеко недостаточно. К тому же, Windows, пока ещё, ПО - не с открытым кодом, изучение "до винтика", достаточно проблематично. Строить выводы на предположениях - не хочется, да и не имеет большого смысла. Кроме того, это должно быть чем-то мотивировано, ибо голова же - не наращиваемый массив накопителей, поэтому забивать её информацией, которая вовсе никогда не пригодится - серьезное расточительство. :)
А если пример кажется притянутым за уши, можно указать на отсутствие описания многих нюансов со стороны MS в их спецификациях, как, например, в случаях с форматом LNK, PE, DOC и т.д.: нравится довольствоваться обобщениями? »
Ну, как обобщениями... по сути, там выводится то, что присутствует и в диспетчере задач, это ведь легко проверить. А для данной, конкретной задачи, вообще не критично конкретное определение загрузки процессора по определенному процессу с абсолютной точностью, вполне достаточно получать общую загрузку. Не станешь же ты утверждать, что это в принципе невозможно? :)
Не будем уже выкать друг другу, не первый день и не на одном форуме пересекаемся достаточно давно... :)
Об этом и речи не было, если вы читали внимательно. Было указано лишь, что счетчики производительности не являются таковыми по своей природе и потому каждое из озвученных решений можно считать верным лишь в теории. »
Пусть так, но я ведь и говорю, что относительной загрузки вполне достаточно.
Т.е. мы всегда можем сравнить то, что выводится в диспетчере задач.
для примера нагружаем процессор:
@echo off
:begin
set /a x = 10000000/500
goto begin
октрываем монитор ресурсов и выводим график по ЦП определенного процесса, CMD.
Далее запускаем powershell и сравниваем выводимые данные в реальном времени:
$process = 'cmd'
get-counter "\процесс($process)\% загруженности процессора"|
select -exp countersamples|
ft instancename,@{n='CPU';e={($_.cookedvalue/100).tostring('P')}}
- в итоге, значения получаем примерно идентичные... для наглядности, можно из этих данных сразу строить график и сравнивать уже его, но пока просто лень даже подумать над этим. :)
В общем, таких относительных измерений, для данной задачи - за глаза и с лихвой, имхо. :)
greg zakharov
05-06-2019, 17:39
YuS_2, думаю, истина где-то посередине: с чем-то согласиться можно,с чем-то - нет, - здесь, нужно полагать, каждый видит проблему со своего ракурса.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.