bourny Posted January 28, 2009 Share Posted January 28, 2009 Is there a way to detect which process is running at over 90% and kill it if it runs for more than 1 minute. ?? Any Help appreciated. Link to comment Share on other sites More sharing options...
bourny Posted January 28, 2009 Author Share Posted January 28, 2009 Is there a way to detect which process is running at over 90% and kill it if it runs for more than 1 minute. ??Any Help appreciated.I just found CPU monitorI think this will do the Link to comment Share on other sites More sharing options...
PsaltyDS Posted January 28, 2009 Share Posted January 28, 2009 Is there a way to detect which process is running at over 90% and kill it if it runs for more than 1 minute. ??Any Help appreciated.Search Example Scripts for _ProcessListProperties(), but read the whole topic and note Microsoft's memory leak issue when it's used in a tight loop. Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
FireFox Posted January 28, 2009 Share Posted January 28, 2009 @bourny expandcollapse popupLocal $init While 1 While 1 $pr = _Checkpercent() ;check for return value If Not @error Then ExitLoop WEnd $init = TimerInit() ;start timer $min = 60000 ; 1min TrayTip('Timer', 'Waiting for ProcessClose...', 1, 1) While 1 $diff = TimerDiff($init) ;diff timer If $min = $diff Then ExitLoop WEnd TrayTip('ProcessClose', $pr, 1, 1) ProcessClose($pr) ;close process WEnd Func _Checkpercent() $pl = ProcessList() ;get process list For $p = 1 To $pl[0][0] ;for process 1 to last process $plp = _ProcessListProperties($pl[$p][1]) ;Get CPU usage TrayTip($pl[$p][1], $plp[1][6], 1, 1) If $plp[1][6] >= 90 Then ; more or 90% of CPU usage If $pl[$p][1] <> 0 Then ;disable non process system Return $pl[$p][1] ;return the process with have +=90% of CPU EndIf EndIf Next ;end process loop Return 0 ;No process found with +=90% of CPU SetError(1) ;Return error for exit loop (in above script) EndFunc ;==>_Checkpercent ;=============================================================================== ; Function Name: _ProcessListProperties() ; Description: Get various properties of a process, or all processes ; Call With: _ProcessListProperties( [$Process [, $sComputer]] ) ; Parameter(s): (optional) $Process - PID or name of a process, default is "" (all) ; (optional) $sComputer - remote computer to get list from, default is local ; Requirement(s): AutoIt v3.2.4.9+ ; Return Value(s): On Success - Returns a 2D array of processes, as in ProcessList() ; with additional columns added: ; [0][0] - Number of processes listed (can be 0 if no matches found) ; [1][0] - 1st process name ; [1][1] - 1st process PID ; [1][2] - 1st process Parent PID ; [1][3] - 1st process owner ; [1][4] - 1st process priority (0 = low, 31 = high) ; [1][5] - 1st process executable path ; [1][6] - 1st process CPU usage ; [1][7] - 1st process memory usage ; [1][8] - 1st process creation date/time = "MM/DD/YYY hh:mm:ss" (hh = 00 to 23) ; [1][9] - 1st process command line string ; ... ; [n][0] thru [n][9] - last process properties ; On Failure: Returns array with [0][0] = 0 and sets @Error to non-zero (see code below) ; Author(s): PsaltyDS at http://www.autoitscript.com/forum ; Date/Version: 09/17/2008 -- v2.0.3 ; Notes: If an integer PID or string process name is provided and no match is found, ; then [0][0] = 0 and @error = 0 (not treated as an error, same as ProcessList) ; This function requires admin permissions to the target computer. ; All properties come from the Win32_Process class in WMI. ; To get time-base properties (CPU and Memory usage), a 100ms SWbemRefresher is used. ;=============================================================================== Func _ProcessListProperties($process = "", $sComputer = ".") Local $sUserName, $sMsg, $sUserDomain, $avProcs, $dtmDate Local $avProcs[1][2] = [[0, ""]], $n = 1 ; Convert PID if passed as string If StringIsInt($process) Then $process = Int($process) ; Connect to WMI and get process objects $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\" & $sComputer & "\root\cimv2") If IsObj($oWMI) Then ; Get collection processes from Win32_Process If $process = "" Then ; Get all $colProcs = $oWMI.ExecQuery("select * from win32_process") ElseIf IsInt($process) Then ; Get by PID $colProcs = $oWMI.ExecQuery("select * from win32_process where ProcessId = " & $process) Else ; Get by Name $colProcs = $oWMI.ExecQuery("select * from win32_process where Name = '" & $process & "'") EndIf If IsObj($colProcs) Then ; Return for no matches If $colProcs.count = 0 Then Return $avProcs ; Size the array ReDim $avProcs[$colProcs.count + 1][10] $avProcs[0][0] = UBound($avProcs) - 1 ; For each process... For $oProc In $colProcs ; [n][0] = Process name $avProcs[$n][0] = $oProc.name ; [n][1] = Process PID $avProcs[$n][1] = $oProc.ProcessId ; [n][2] = Parent PID $avProcs[$n][2] = $oProc.ParentProcessId ; [n][3] = Owner If $oProc.GetOwner($sUserName, $sUserDomain) = 0 Then $avProcs[$n][3] = $sUserDomain & "\" & $sUserName ; [n][4] = Priority $avProcs[$n][4] = $oProc.Priority ; [n][5] = Executable path $avProcs[$n][5] = $oProc.ExecutablePath ; [n][8] = Creation date/time $dtmDate = $oProc.CreationDate If $dtmDate <> "" Then ; Back referencing RegExp pattern from weaponx Local $sRegExpPatt = "\A(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:.*)" $dtmDate = StringRegExpReplace($dtmDate, $sRegExpPatt, "$2/$3/$1 $4:$5:$6") EndIf $avProcs[$n][8] = $dtmDate ; [n][9] = Command line string $avProcs[$n][9] = $oProc.CommandLine ; increment index $n += 1 Next Else SetError(2); Error getting process collection from WMI EndIf ; release the collection object $colProcs = 0 ; Get collection of all processes from Win32_PerfFormattedData_PerfProc_Process ; Have to use an SWbemRefresher to pull the collection, or all Perf data will be zeros Local $oRefresher = ObjCreate("WbemScripting.SWbemRefresher") $colProcs = $oRefresher.AddEnum($oWMI, "Win32_PerfFormattedData_PerfProc_Process" ).objectSet $oRefresher.Refresh ; Time delay before calling refresher Local $iTime = TimerInit() Do Sleep(20) Until TimerDiff($iTime) >= 100 $oRefresher.Refresh ; Get PerfProc data For $oProc In $colProcs ; Find it in the array For $n = 1 To $avProcs[0][0] If $avProcs[$n][1] = $oProc.IDProcess Then ; [n][6] = CPU usage $avProcs[$n][6] = $oProc.PercentProcessorTime ; [n][7] = memory usage $avProcs[$n][7] = $oProc.WorkingSet ExitLoop EndIf Next Next Else SetError(1); Error connecting to WMI EndIf ; Return array Return $avProcs EndFunc ;==>_ProcessListProperties Hope this help you Cheers, FireFox. Link to comment Share on other sites More sharing options...
PsaltyDS Posted January 28, 2009 Share Posted January 28, 2009 (edited) You are calling _ProcessListProperties() In a tight loop. Mind what I said about the Microsoft memory leak issue With WMI SWbemRefresher. Edited October 16, 2017 by Jos removed the quote as that was garbled Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
FireFox Posted January 28, 2009 Share Posted January 28, 2009 @PsaltyDS I know...but its an example, if you have another way then you have the right to post it...... Cheers, FireFox. Link to comment Share on other sites More sharing options...
LoWang Posted July 3, 2010 Share Posted July 3, 2010 (edited) Guys I found a much faster and better way to do this IMO. It is the utility called simply process.exe from BeyondLogic. Google it. It shows everything in a second and not in 20seconds like this script Although it is a bit old and does not display the Idle percentage properly on multicore CPUs :- Edited May 6, 2012 by LoWang Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now