Jump to content
Sign in to follow this  
ManualIT

Restart a program when it reaches above 1GB of memory

Recommended Posts

Guys, i need help on creating a script that restarts a program once it starts using more than 1GB of memory.

No idea how to start on the script, i don't know which functions i should use for process memory reading.

 

My mind is in total blank at the moment, so i need a kick start :sweating:

Share this post


Link to post
Share on other sites
On 1/31/2019 at 8:24 PM, argumentum said:

Thank you so much but this is too advanced for me :>

 

On 1/31/2019 at 7:48 PM, Nine said:

look at ProcessGetStats ()  function

Thanks!

I've searched about this function and came up with this script so far for testing:

#include <MsgBoxConstants.au3>

While 1
    $memory = ProcessGetStats("mspaint.exe")
    Sleep(1000)
    call ("check")
    ConsoleWrite($memory[0]/1024&@CRLF)
WEnd

Func check()
If $memory > 30000 Then
   MsgBox($MB_SYSTEMMODAL, "Alert!", "Restart program")
   Exit
EndIf
EndFunc

It reads and writes the correct used memory on the console, however it doesn't detect when it goes over 30000 kilobytes

Edited by ManualIT

Share this post


Link to post
Share on other sites

@ManualIT

The ProcessGetStats() function returns an array.  In your check() function, you  are referencing $memory (the array) when you should be referencing $memory[0] / 1024

The script below does basically the same thing as what your script was doing, with the correction that I pointed out and a some remarks to help make it clear.  Also note the @error checking.  Coding defensively, in order to catch and handle errors when they occur, will save you a lot of headaches when your scripts get longer and more complex.  If you start the script without MSPaint running, you will get an error message.  Your original script would not have recognized that mspaint wasn't running and just continued on.

#include <Constants.au3>

Global $aMemStats
Global $nMemKB

While 1
    ;Get process' memory stats
    $aMemStats = ProcessGetStats("mspaint.exe")
    If @error Then
        MsgBox($MB_ICONERROR, "ERROR", "Unable to get process stats. Check to make sure mspaint is running.")
        Exit
    EndIf

    ;Convert bytes to kilobytes
    $nMemKB = $aMemStats[0] / 1024

    ;If threshhold exceeded
    If $nMemKB > 30000 Then
        ;Display message and exit
        MsgBox($MB_ICONWARNING, "WARNING", "MSPaint memory limit exceeded!" & @CRLF & "Working set = " & $nMemKB)
        Exit
    EndIf

    ;Wait a second
    Sleep(1000)
WEnd

 

Edited by TheXman

Share this post


Link to post
Share on other sites

I am Trying to complet this with adding the addition of multiple process with same name.


My video tutorials : HERE ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

@TheXman This should do the trick for me. Why it s not same as my tskmgr ?

 

#include <Constants.au3>
#include <Array.au3>

Global $aMemStats , $aMemStats2 = 0
Global $nMemKB

While 1
    ;Get process' memory stats
    $ProcessName = "Firefox.exe"
    $ProcessList = ProcessList ($ProcessName)
    If @error Then
        MsgBox($MB_ICONERROR, "ERROR", "Unable to get process stats. Check to make sure mspaint is running.")
        Exit
    EndIf
    If IsArray ($ProcessList) Then
       _ArrayDisplay ($ProcessList)
      $iRaws = UBound ( $ProcessList )

       For $i = 0 To $iRaws -1
         $aMemStatsProcessID = ProcessGetStats($ProcessList[$i][1])
         $aMemStatsProcessName = ProcessGetStats($ProcessList[$i][0])

         $aMemStats1 = ProcessGetStats($ProcessList[$i][1])
         $aMemStats2 = $aMemStats2+$aMemStats1[1]
         MsgBox(0,"$aMemStats2",$aMemStats2/ 1024 / 1024 )
       Next
    EndIf

    ;Convert bytes to Mo
    $nMemKB = $aMemStats2 / 1024 / 1024
    MsgBox($MB_ICONWARNING, " Mo",$nMemKB)

    ;If threshhold exceeded
    $Limite = 250
    If $nMemKB > $Limite Then
        ;Display message and exit
        MsgBox($MB_ICONWARNING, "WARNING", "Firefox memory limit (/"&$Limite&" Mo) exceeded!" & @CRLF & "Working set = " & $nMemKB &"/"&$Limite&" Mo" )
        Exit
    EndIf
    ;Wait a second
    Sleep(1000)
WEnd

 

 

Edited by caramen

My video tutorials : HERE ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

Hmmmmmmmmm close

#include <Constants.au3>
#include <Array.au3>

Global $aMemStats1 = 0 , $aMemStats2 = 0
Global $nMemKB

While 1
   $aMemStats1 = 0
   $aMemStats2 = 0
    ;Get process' memory stats
    $ProcessName = ""
    If $ProcessName = "" Then
       $ProcessList = ProcessList ()
        If @error Then
        MsgBox($MB_ICONERROR, "ERROR", "Unable to get process stats. Check to make sure "&$ProcessName&" is running.")
        Exit
    EndIf
    Else
       $ProcessList = ProcessList ($ProcessName)
        If @error Then
        MsgBox($MB_ICONERROR, "ERROR", "Unable to get process stats. Check to make sure "&$ProcessName&" is running.")
        Exit
    EndIf
    EndIf
    If IsArray ($ProcessList) Then
       _ArrayDisplay ($ProcessList)
      $iRaws = UBound ( $ProcessList )

       For $i = 1 To $iRaws -1
         $aMemStatsProcessID = ProcessGetStats($ProcessList[$i][1])
         $aMemStatsProcessName = ProcessGetStats($ProcessList[$i][0])

         $aMemStats1 = ProcessGetStats($ProcessList[$i][1])
         If IsArray ($aMemStats1) Then
         $Message = $aMemStats1[1]
         $ProcessName = $ProcessList[$i][0]
         ;MsgBox($MB_ICONWARNING,"Addition", $Message&" "&$ProcessName&" PID:" &$ProcessList[$i][1] )
         $Message &=' + '
         $Message &= $aMemStats2
         $Message &= ' = '
         $Message &= $aMemStats1[1]+$aMemStats2
         ;MsgBox(0,"Addition", $Message )
         $aMemStats2 = $aMemStats2+$aMemStats1[1]
         ;MsgBox(0,"$aMemStats2",$aMemStats2)
         EndIf
       Next
    EndIf

    ;Convert bytes to Mo
    $nMemKB = $aMemStats2 / 8388608
    $nMemKB = Round($nMemKB ,0)
    ;$nMemKB = $aMemStats2 / 1048576
    $Message = $aMemStats2&'b / 8388608b(=1Mo) ='&$nMemKB&' Mo'
    MsgBox($MB_ICONWARNING, "b / Mo",$Message)

    ;If threshhold exceeded
    $Limite = 4300
    If $nMemKB > $Limite Then
        ;Display message and exit
        MsgBox($MB_ICONWARNING, "WARNING", "Firefox memory limit (/"&$Limite&" Mo) exceeded!" & @CRLF & "Working set = " & $nMemKB &"/"&$Limite&" Mo" )
        Exit
    EndIf
    ;Wait a second
    Sleep(1000)
WEnd

 

Edited by caramen

My video tutorials : HERE ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites
4 hours ago, caramen said:

Why it s not same as my tskmgr ?

I have to assume that you are asking why doesn't your calculated "working set" memory, in megabytes, match what's displayed in your task manager.  If that's true, what is the heading title of the memory column that you are looking at in the task manager?  Is it "Working Set (memory)"?  If it is not, then change it to "Working Set (memory)" and see if it matches.

 

Edited by TheXman

Share this post


Link to post
Share on other sites

image.png.b7624460c1094787c638526a2fe0bc04.png


My video tutorials : HERE ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

@caramen

#include <Constants.au3>
#include <Array.au3>

Const $PROCESS_NAME  = "firefox.exe"
Const $MB_LIMIT      = 250

Global $aMemStats , $aProcessList
Global $nMemKB, $nMemMB

While 1
    ;Get process list
    $aProcessList = ProcessList ($PROCESS_NAME)
    If Not IsArray($aProcessList) Or $aProcessList[0][0] = 0 Then
        MsgBox($MB_ICONERROR, "ERROR", StringFormat('Unable to get process list for "%s".', $PROCESS_NAME))
        Exit
    EndIf

    ;Calculate total kb of processes
    $nMemKB = 0
    For $i = 1 To $aProcessList[0][0]
        $aMemStats = ProcessGetStats($aProcessList[$i][1])
        $nMemKB += ($aMemStats[0] / 1024)
    Next

    ;Convert bytes kb to mb
    $nMemMB = $nMemKB / 1024

    ConsoleWrite(StringFormat("Total KB = %i", $nMemKB) & @CRLF)
    ConsoleWrite(StringFormat("Total MB = %i", $nMemMB) & @CRLF)

    ;If threshhold exceeded
    If $nMemMB > $MB_LIMIT Then
        ;Display message and exit
        MsgBox($MB_ICONWARNING, "WARNING", _
            StringFormat("Firefox memory limit exceeded.\nActual MB = %i\nLimit MB = %i", $nMemMB, $MB_LIMIT) _
        )
        Exit
    EndIf

    ;Wait a second
    Sleep(1000)
WEnd

 

Edited by TheXman
Fixed a typo

Share this post


Link to post
Share on other sites

nice


My video tutorials : HERE ( In construction )  || My Discord : https://discord.gg/S9AnwHw

How to Ask Help ||  UIAutomation From Junkew || WebDriver From Danp2 || And Water's UDFs in the Quote

Spoiler

 Water's UDFs:
Active Directory (NEW 2018-10-19 - Version 1.4.10.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-10-31 - Version 1.3.4.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By Pricehacker
      Hello!
      Im wondering if it is possible to 'empty' the variable value to save memory, for example i often use variable as a onetime use thing and would prefer to 'forget' it after is is used
      Maybe it is just as easy as to setting $vVar = Null, but i wanted to make sure that this is the case
    • By CarlD
      Is there a reliable way to ensure that data assigned to variables in a script is overwritten or deleted when the script exits? I have scripts that encrypt/decrypt data and would like to ensure, if possible, that the encryption keys and decrypted data do not stay in memory after the script exits. Thanks.
    • By Tersion
      Here test example of a dummy program with random added controls to the main form:
      If #include <GuiListView.au3> is commented out, then this simple program uses around 3,5 MB of RAM. When #include <GuiListView.au3> NOT commented out - RAM usage is around 13-14 MB.
      How can I reduce memory usage? Even if I'm not using GuiListView.au3 - 3,5 MB quite a bit for a such dummy program!
      I found out that using this DLLCall in main loop:
      DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", -1) Significantly reduces RAM usage (even with GuiListView.au3 included, from 13-14 MB to 600 KB !!! ) but I'm not sure if it's doesn't have any impact to common workflow of a program...
      So, give me any advice about that, please.
    • By DynamicRookie
      Hey there!
       
      I've been developing a artificial intelligence.

      My first hard task was letting the A.I know when a sentence is found in memory with different words
      What i tried to do here is simply, get all the words in user sentence that could be used
      as a identifier
              
              example: Steve Jobs
              
              then identify the sentence purpose with the words we found in the past "for" loop
              
              example: Do/Know/You/Who/Steve/Jobs
              
              Compare the example in the following matching sentences in memory.
              
              1-Steve jobs was a known person
              2-Do you know who barack obama is?
              3-Do you know Steve jobs?
              4-Do you know who steve jobs is?
              5-How much money steve jobs had
              
              Then find the sentence that has way more matches than the other ones, remember that if the identifier words were not found
              (Steve jobs) then the sentence is invalid.
              
              Every sentence has a different answer and is important that the right one is chosen.
              
      If there's no more than the half of words in matches, then assign a variable the result of function, such as a return but for a global var.
      I couldn't figure out how to do that with StringRegExp.
       
      I honestly need help with detecting identifiers on memory sentences.
      I would also like to let the AI know typos, meaning that moeny and money means the same thing.
      Any help is hugely appreciated.

       
    • By toto22
      I'm trying to get a "double" value from memory . However my code gives me error.
       
      Opt("WinTitleMatchMode", 4)     Global $ProcessID = WinGetProcess("TI Pro")     If $ProcessID = -1 Then         MsgBox(4096, "ERROR", "Failed to detect process.")         Exit     EndIf     Local $DllInformation = _MemoryOpen($ProcessID)     If @Error Then         MsgBox(4096, "ERROR", "Failed to open memory.")         Exit     EndIf   Local $dAddress = 0x1FECD474   Local $tNbSteps = DllStructCreate("double", $dAddress)   Local $value = DllStructSetData($tNbSteps, 1, (_MemoryRead($dAddress, $DllInformation)))      MsgBox($MB_SYSTEMMODAL, $value)
×
×
  • Create New...