maltenburg
Goto Top

Powershell Skript Arbeitsspeicher auslesen und Programm schließen

Hallo zusammen,

Ich habe folgendes Problem.
Kurz zum Hintergrund ich arbeite bei einem Verkehrsunternehmen und wir haben in unserem Tunnel TFT Bildschirme zur Fahrgast Anzeige.
Diese laufen auf einem Windows System sind aber sehr schwach was den Arbeitsspeicher angeht.
Es läuft eine Website im Firefox. Da immer Zugzielanzeigen und Infozeilen den ganzen Tag laufen läuft der Arbeitsspeicher recht schnell voll.
Jetzt kam die Idee auf jeden Anzeiger mit Powershell zu überwachen und wenn der Arbeitsspeicher zb. 95% belegt ist
den Browser zu schließen und neu starten.

Ich habe online gesucht habe aber nichts richtiges gefunden.

Meine Idee ist nun den Arbeitsspeicher alle 5 min in eine Datei zu schreiben und wenn der Arbeitsspeicher bei 95% dann den Browser schließen und wieder neu öffnen.

Wer kann mir dabei helfen da ich mit Powershell überhaupt nicht auskenne und das Thema ziemlich eilig ist

Danke Euch...

Liebe Grüße

Markus

Content-ID: 668680

Url: https://administrator.de/contentid/668680

Ausgedruckt am: 03.12.2024 um 17:12 Uhr

insidERR
insidERR 10.10.2024 um 09:56:43 Uhr
Goto Top
Gib mal deine Frage, so wie du sie hier stellst, beim "Microsoft Copilot" (ist im Edge Browser integriert) ein.
Das Ding ist nicht perfekt, lenkt einen aber schon in die gewünschte Richtung.
MAltenburg
MAltenburg 10.10.2024 um 10:04:28 Uhr
Goto Top
Das habe ich schon

# Intervall für die Überprüfung in Sekunden
$interval = 5
 
while ($true) {
    # Arbeitsspeicherauslastung in Prozent
    $memoryUsage = (Get-Counter '\Memory\% Committed Bytes In Use').CounterSamples.CookedValue  
 
    # CPU-Auslastung in Prozent
    $cpuUsage = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue  
 
    Write-Host "CPU-Auslastung: $cpuUsage%"  
    Write-Host "Arbeitsspeicherauslastung: $memoryUsage%"  
 
    # Überprüfen, ob die Arbeitsspeicherauslastung 95% überschreitet
    if ($memoryUsage -gt 95) {
        # Firefox-Prozess beenden
        Get-Process -Name "firefox" -ErrorAction SilentlyContinue | ForEach-Object {  
            $_.Kill()
            Write-Host "Firefox wurde geschlossen, da die Arbeitsspeicherauslastung $memoryUsage% erreicht hat."  
        }
    }
 
    # Warten für das nächste Intervall
    Start-Sleep -Seconds $interval
}


Dieser gibt mir aber eine Fehlermeldung aus

Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
+ CategoryInfo : ParserError: (face-smile [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace

Das sagt mir aber dann wieder überhaupt nichts
150704
150704 10.10.2024 aktualisiert um 10:10:13 Uhr
Goto Top
Für sowas brauchst du kein Skript, es reicht im Performance-Monitor einen Trigger anzulegen der beim Überschreiten der gewünschten RAM Schwelle dein Skript ausführt.

Von Hand geht auch, effizienter geht es aber mit den Performance-Triggern wenn du eh schon nen Winblows nutzt.

(Get-Counter '\Memory\Available MBytes').CounterSamples.CookedValue  
(Bezeichnung des Counters anpassen falls ein deutsches System zum Einsatz kommt)
pebcak7123
pebcak7123 10.10.2024 um 10:08:32 Uhr
Goto Top
Moin,
bitte dran denken das die perfomance counter leider je nach windows sprache anders heissen, danke MS...
bei deutschem WIndows ist es zB
 (Get-Counter '\Arbeitsspeicher\Verfügbare MB').CounterSamples.CookedValue  
MAltenburg
MAltenburg 10.10.2024 um 10:19:58 Uhr
Goto Top
Ah super
Die deutsche Variante funktioniert
könntest du mir den Befehl für die CPU Auslastung auch schicken?
canlot
canlot 10.10.2024 aktualisiert um 10:32:21 Uhr
Goto Top
Ahhhhhh die anderen waren schneller :D

$processName = "firefox"  
$lessThanInProcent = 5

$os = Get-Ciminstance Win32_OperatingSystem

$procentFreeRam = [math]::Round(($os.FreePhysicalMemory/$os.TotalVisibleMemorySize)*100,2)

if($procentFreeRam -le $lessThanInProcent)
{
    Get-Process -ProcessName "*$processName*" | Stop-Process -Force  
    Get-Process -ProcessName "*$processName*" | Start-Process  
}
150704
Lösung 150704 10.10.2024 aktualisiert um 10:29:34 Uhr
Goto Top
Befehl für die CPU Auslastung
(Get-Counter "\prozessor(_total)\prozessorzeit (%)").countersamples.CookedValue  
Die Bezeichnungen der Performance Counter kannst du übrigens im Performance Monitor (perfmon.msc) auch selbst nachschlagen 😉
MysticFoxDE
MysticFoxDE 10.10.2024 um 21:11:13 Uhr
Goto Top
Moin Zusammen,

der Befehl zum Abrufen des wirklich freien Speicherplatzes lautet ...

((Get-Counter "\Arbeitsspeicher\Freie und Nullseitenlisten - Bytes").CounterSamples.CookedValue) / 1024 / 1024  

... wenn man diesen in MB angezeigt bekommen möchte. 😉

Der Counter "\Memory\Available MBytes" oder "\Arbeitsspeicher\Verfügbare MB" ist diesbezüglich leider nicht korrekt, da dieser die RAM Belegung durch das sogenannte "Stand-By-Memory" nicht mitberücksichtigt. 😔

Gruss Alex