Что нового

[Процессы] узнать какой процесс использует слишком много cpu

.me

Новичок
Сообщения
89
Репутация
1
Приветствую.
Возможно ли как то программно узнать какой из процессов использует, например больше 30-50-80%, к примеру если хром(одна из вкладок) грузит cpu на 40% - нужно ее закрыть
 
Автор
M

.me

Новичок
Сообщения
89
Репутация
1
InnI, спасибо, но дело в том, что процесс нужно вначале узнать какой грузит >
 

InnI

AutoIT Гуру
Сообщения
4,957
Репутация
1,448
.me
процесс нужно вначале узнать какой грузит
В той теме как раз об этом и сказано.
Берёте список процессов
Код:
ProcessList()
и получаете загрузку CPU по каждому из них.
 
Автор
M

.me

Новичок
Сообщения
89
Репутация
1
InnI, нашел еще один ваш пост, но не могу никак сделать так, что бы процесс который грузит цпу более чем % закрывался
Код:
#Include <WinAPISys.au3>

AdlibRegister('_CPU', 500)

Global $Time1, $Time2, $CPU

While Sleep(100)
  If $CPU > 20 Then
    ; ConsoleWrite("start : " & $CPU & @CRLF)
    Do
      Sleep(100)
    Until $CPU < 10
    Beep()
    ; ConsoleWrite("stop : " & $CPU & @CRLF)
  EndIf
WEnd

; http://autoit-script.ru/index.php?topic=2715.msg39572#msg39572
Func _CPU()
  $Time2 = _WinAPI_GetSystemTimes()
  If IsArray($Time1) Then
    Local $TimeBusyCPU = ($Time2[1] + $Time2[2]) - ($Time1[1] + $Time1[2])
    Local $TimeIdleCPU = ($Time2[0] - $Time1[0])
    $CPU = Round(($TimeBusyCPU - $TimeIdleCPU) / $TimeBusyCPU * 100)
  EndIf
  $Time1 = $Time2
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,957
Репутация
1,448
.me
если хром(одна из вкладок) грузит cpu на 40% - нужно ее закрыть
Код:
#include <WinAPISys.au3>
#include <WinAPIProc.au3>

While Sleep(111)
  $aUse = _ProcessListUsage("chrome.exe")
  For $i = 1 To $aUse[0][0]
    If $aUse[$i][2] >= 40 Then ProcessClose($aUse[$i][1])
  Next
WEnd

; -----------------------------------------------------------------
; Параметры: $Name - имя процесса (по умолчанию все процессы)
;            $Period - время расчёта загрузки (по умолчанию 500 мс)
; Возвращает: массив
;            Array[0][0] - количество процессов
;            Array[n][0] - имя процесса
;            Array[n][1] - идентификатор процесса
;            Array[n][2] - процент загрузки
; -----------------------------------------------------------------
Func _ProcessListUsage($Name = Default, $Period = Default)
  Local $aErr[1][3], $aList = ($Name = Default) ? ProcessList() : ProcessList($Name)
  If @error Or Not $aList[0][0] Then Return SetError(1, 0, $aErr)
  If $Period = Default Then $Period = 500
  Local $aPrev[UBound($aList)], $aTime[UBound($aList)]
  Local $PrevProc, $PrevSys, $TimeProc, $TimeSys
  $PrevSys = _WinAPI_GetSystemTimes()
  If Not @error Then $PrevSys = $PrevSys[1] + $PrevSys[2]
  For $i = 1 To $aList[0][0]
    $PrevProc = _WinAPI_GetProcessTimes($aList[$i][1])
    If Not @error Then $aPrev[$i] = $PrevProc[1] + $PrevProc[2]
  Next
  Sleep($Period)
  $TimeSys = _WinAPI_GetSystemTimes()
  If Not @error Then $TimeSys = $TimeSys[1] + $TimeSys[2]
  For $i = 1 To $aList[0][0]
    $TimeProc = _WinAPI_GetProcessTimes($aList[$i][1])
    If Not @error Then $aTime[$i] = $TimeProc[1] + $TimeProc[2]
  Next
  ReDim $aList[UBound($aList)][3]
  For $i = 1 To $aList[0][0]
    $aList[$i][2] = Round(($aTime[$i] - $aPrev[$i]) / ($TimeSys - $PrevSys) * 100)
  Next
  Return $aList
EndFunc
 

timit

Новичок
Сообщения
4
Репутация
0
Всем доброго дня, столкнулся с подобной задачей, вопрос а как модернизировать что бы закрывался не весь процесс chrome.exe а только тот который отвечает за конкретную вкладку которая грузит проц, просто при запуске скрипта написанного выше у меня закрывается весь хром целиком при достижении % по нагрузке цп?
 

InnI

AutoIT Гуру
Сообщения
4,957
Репутация
1,448
закрывается весь хром целиком при достижении % по нагрузке цп
У меня при запуске chrome с пустой вкладкой создаются 8 процессов chrome.exe. Один из них главный, остальные дочерние. При закрытии главного процесса будут закрыты и все дочерние. Вероятно, у вас именно главный процесс грузит процессор.
 

timit

Новичок
Сообщения
4
Репутация
0
вероятно...
но тогда следующий вопрос а можно ли этот скрипт применить на терминалах к примеру есть пользователь admin
и ещё n количество пользователей, я так понял что скрипт работает только от того пользователя который запустил его....
а как сделать что бы скрипт считывал информацию с остальных n пользователей?
ну кроме того что бы поставить в автозагрузку и плодить запущенные задачи
 

InnI

AutoIT Гуру
Сообщения
4,957
Репутация
1,448
Как-то не доводилось мне с терминалами работать. Попробуйте с правами администратора запустить
Код:
#RequireAdmin
 

All2khoff

Продвинутый
Сообщения
376
Репутация
68
Очень рекомендую составить список процессов за которыми надо следить или какие игнорировать, я представляю состояние бухгалтера который крутит срочный отчёт, а у него раз за разом закрывается 1с.
можно ли этот скрипт применить на терминалах
Завтра у себя на работе проверю возможность смотреть на процессы пользователей на rdp-сервере
UPD: получилось получить список пользователей с запущенной 1с.
test.png
Код:
$avArray = ""

$aList = ProcessList ("1cv8.exe")
For $i=1 To $aList[0][0]
    $avArray = $avArray & ($aList[$i][1] &": "& _ProcessGetOwner($aList[$i][1]) &@CRLF)
 Next

 MsgBox ( 0, "title", $avArray )

Func _ProcessGetOwner($PID, $sComputer = ".")
    Local $objWMI, $colProcs, $sUserName, $sUserDomain
    $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
    If IsObj($objWMI) Then
        $colProcs = $objWMI.ExecQuery("Select ProcessId From Win32_Process Where ProcessId="& $PID)
        If IsObj($colProcs) Then
            For $Proc In $colProcs
                If $Proc.GetOwner($sUserName, $sUserDomain)=0 Then Return $sUserDomain & "\" & $sUserName
            Next
        EndIf
    EndIf
EndFunc
 
Последнее редактирование:
Верх