Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Bat для запуска приложения при падении нагрузки ЦП другого процесса (http://forum.oszone.net/showthread.php?t=340786)

lepi4 04-06-2019 10:39 2874310

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

, а при снижении нагрузки никак найти не могу. Прошу прощения если дубль

alpap 04-06-2019 13:49 2874328

Это надо?
Перезапуск процесса, если потребляет менее 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


lepi4 04-06-2019 15:21 2874337

нет, не это. Либо нагрузка процесса на ЦП, либо общая загрузка ЦП

alpap 04-06-2019 16:06 2874345

Цитата:

Цитата lepi4
нагрузка процесса на ЦП, либо общая загрузка ЦП »

а как выявить точную долю процесса в загрузке ЦП, на каком-то этапе нагрузка этого процесса будет выше чем обычно, но при этом остальные процессы будут иметь очень слабую загрузку или какой-то другой появляющийся процесс может загрузить ЦП выше нужного вам предела, а ваш процесс почти бездействовать. По-моему только памятью и можно оперировать.
вот общий процент загрузки процессора:
Код:

wmic CPU get LoadPercentage /value
но что это дает, как по этому можно судить в какое время из этого числа именно нужный процесс нагрузил более чем надо?

Iska 04-06-2019 17:31 2874365

Win32_PerfFormattedData_PerfProc_Process (но у меня не работает).

lepi4 04-06-2019 17:45 2874367

А не допускаете что процесс может просто не расходовать большое количество оперативной памяти? что 60%ЦП что 1% - расход оперативы 125мб. И как тут лезть с оперативой. Как посмотреть загрузку ЦП, и процесс я знаю. Мне нужно понять как из это сделать переменную IF. Как там будет с остальными процессами и как будет меняться в загрузке это не важно, нужна конкретная задача - запуск приложения при падении нагрузки процессом ЦП ниже 30% (или обще загрузки ЦП ниже 50
Код:

wmic CPU get LoadPercentage /value
if "LoadPercentage" gtr 24 goto 1
if "LoadPercentage" lss 24 goto 2

как сделать из этого рабочее состояние?

alpap 04-06-2019 19:56 2874392

Код:

@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


YuS_2 04-06-2019 21:57 2874419

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 2874453

YuS_2, в cmd есть typeperf, однако ни alpap, ни вы не берете в расчет один простой нюанс касательно того, что именно подразумевается под нагрузкой ЦП в винде. Попробую объяснить популярно на пальцах. В случае с WMI оснастка возвращает последнее пиковое значение счетчика производительности, последний якобы отображает загрузку процессора в процентах. На деле же так как каждому потоку отпускается определенный квант времени, по истечении которого планировщик очереди потоков принудительно передаст управление потоку, ближе всех стоящему в очереди, логично заключить: счетчик производительности измеряет не загрузку как таковую, это - готовность планировщика предоставить управление потоку по первому требованию (всплески активности возникают при переключении потоков). Счетчики производительности предоставляются системой посредством такой NTAPI'шной функции, как NtQuerySystemInformation, при этом далеко не все из SYSTEM_INFORMATION_CLASS возвращает данные из "низов", это также справедливо и для загрузки ЦП. Иными словами, загрузка ЦП условна, и гарантированно сказать, что к всплеску привело именно такое-то приложение, а не работающее "параллельно", которое, скажем, активно использует системный таймер, невозможно (что не совсем справедливо в случае таких систем как 8.1 и 10).

YuS_2 05-06-2019 10:17 2874462

greg zakharov,
Цитата:

Цитата greg zakharov
ни вы не берете в расчет один простой нюанс касательно того, что именно подразумевается под нагрузкой ЦП в винде. »

Григорий, вот скажите, а зачем так глубоко копать? Powershell предоставляет инструмент, я его использую...
Код:

get-counter "\процесс(*)\% загруженности процессора"|
select -exp countersamples|
ft instancename,@{n='CPU';e={($_.cookedvalue/100).tostring('P')}} -auto

по-моему, здесь конкретно написано и даже по-русски:
Цитата:

процесс()
% загруженности процессора
Выдает это:
Код:

get-counter -ListSet *
в соответствии с документацией.
А что там наворотила микрософт внутри WMI, мне неинтересно. Если что-то чему-то, по какой-то причине не соответствует, то это баг, который должен быть где-то описан и возможно, даже записан в очередь на исправление (что в случае с микрософт весьма сомнительно) :)

Цитата:

Цитата greg zakharov
На деле же так как каждому потоку отпускается определенный квант времени, по истечении которого планировщик очереди потоков принудительно передаст управление потоку, ближе всех стоящему в очереди, логично заключить: счетчик производительности измеряет не загрузку как таковую, это - готовность планировщика предоставить управление потоку по первому требованию (всплески активности возникают при переключении потоков). »

Это в теории.
А практически, в официальной документации написано следующее:
Цитата:

Объект "Процесс" создается в момент запуска программы. Все потоки этого процесса используют одно и то же адресное пространство и имеют доступ к одним и тем же данным.
Почему мы не должны верить написанному?


В общем, резюмируем:
Код:

$process = 'explorer'
get-counter "\процесс($process)\% загруженности процессора" -sam 5 -cont|
select -exp countersamples|%{
        if($_.cookedvalue -lt 1){
                "$process ушел курить"
        }else{"$process весь в работе"}
}

- прерывание скрипта по Ctrl+C
Это всё, что требовалось ТС.
Цитата:

Цитата greg zakharov
загрузка ЦП условна »

бесспорно, но в данной задаче не требуются атомные точности, если я правильно понял. Такого функционала вполне должно хватить...

greg zakharov 05-06-2019 13:22 2874486

Цитата:

Цитата YuS_2
Если что-то чему-то, по какой-то причине не соответствует, то это баг, который должен быть где-то описан и возможно, даже записан в очередь на исправление

Следуя этой логике, Windows один сплошной баг.
Цитата:

Цитата YuS_2
Это в теории.
А практически, в официальной документации написано следующее

Увы, не теория, а факты. Ответьте, только честно, дадут вам яблоко с виду не испорченное, но заведомо гнилое внутри (при этом "угощающий" вас в курсе начинки), и скажут "это хорошее яблоко", вы поверите наслово и станете есть яблоко как есть или же, будучи прагматиком, разрежете яблоко дабы убедиться в чистоте плода? Конечно, вы можете не любить яблоки, но это для примера, чтобы пришло осознание происходящего в недрах винды. А если пример кажется притянутым за уши, можно указать на отсутствие описания многих нюансов со стороны MS в их спецификациях, как, например, в случаях с форматом LNK, PE, DOC и т.д.: нравится довольствоваться обобщениями? - дело сугубо личное.
Цитата:

Цитата YuS_2
в данной задаче не требуются атомные точности

Об этом и речи не было, если вы читали внимательно. Было указано лишь, что счетчики производительности не являются таковыми по своей природе и потому каждое из озвученных решений можно считать верным лишь в теории.

YuS_2 05-06-2019 14:24 2874497

Цитата:

Цитата greg zakharov
Следуя этой логике, Windows один сплошной баг. »

Ну, дык, с этим даже спорить трудно :)

Цитата:

Цитата greg zakharov
Ответьте, только честно, дадут вам яблоко с виду не испорченное, но заведомо гнилое внутри (при этом "угощающий" вас в курсе начинки), и скажут "это хорошее яблоко", вы поверите наслово и станете есть яблоко как есть или же, будучи прагматиком, разрежете яблоко дабы убедиться в чистоте плода? »

Когда я покупаю в магазине яблоки, увы, я их не разрезаю, но на внешний вид смотрю, как минимум. Хоть это и не совсем подходящий пример для сравнения, но вообще мысль понятна.
Я бы подобрал такой пример:
Садясь за руль автомобиля, не каждый имеет представление о всех процессах, происходящих внутри современного двигателя, тем не менее, пользоваться автомобилем умеет каждый, кто этому обучался, т.е. для управления автомобилем совсем не обязательно изучать физику и химию происходящих процессов при работе двигателя, достаточно знать, что он работает исправно и нигде, ничего посторонних звуков не издает.
Если уж задаваться целью досконального изучения, то придется изучать устройство и структуру процессоров, их систему команд и прочее-прочее, напрямую имеющее отношение к электронике, т.е. только софтверных знаний тут будет далеко недостаточно. К тому же, Windows, пока ещё, ПО - не с открытым кодом, изучение "до винтика", достаточно проблематично. Строить выводы на предположениях - не хочется, да и не имеет большого смысла. Кроме того, это должно быть чем-то мотивировано, ибо голова же - не наращиваемый массив накопителей, поэтому забивать её информацией, которая вовсе никогда не пригодится - серьезное расточительство. :)

Цитата:

Цитата greg zakharov
А если пример кажется притянутым за уши, можно указать на отсутствие описания многих нюансов со стороны MS в их спецификациях, как, например, в случаях с форматом LNK, PE, DOC и т.д.: нравится довольствоваться обобщениями? »

Ну, как обобщениями... по сути, там выводится то, что присутствует и в диспетчере задач, это ведь легко проверить. А для данной, конкретной задачи, вообще не критично конкретное определение загрузки процессора по определенному процессу с абсолютной точностью, вполне достаточно получать общую загрузку. Не станешь же ты утверждать, что это в принципе невозможно? :)
Не будем уже выкать друг другу, не первый день и не на одном форуме пересекаемся достаточно давно... :)

Цитата:

Цитата greg zakharov
Об этом и речи не было, если вы читали внимательно. Было указано лишь, что счетчики производительности не являются таковыми по своей природе и потому каждое из озвученных решений можно считать верным лишь в теории. »

Пусть так, но я ведь и говорю, что относительной загрузки вполне достаточно.
Т.е. мы всегда можем сравнить то, что выводится в диспетчере задач.
для примера нагружаем процессор:
Код:

@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 2874507

YuS_2, думаю, истина где-то посередине: с чем-то согласиться можно,с чем-то - нет, - здесь, нужно полагать, каждый видит проблему со своего ракурса.


Время: 10:28.

Время: 10:28.
© OSzone.net 2001-