Uccidere il processo di violazione della memoria ma mantenere i genitori al sicuro in Powershell


1

Ho bisogno di aiuto per uccidere il processo figlio ma mantengo il genitore al sicuro. Sono nuovo dello scripting PowerShell [ovviamente]. Ecco esattamente quello che mi serve:

Ho dei processi che utilizzano più di 500.000 K di memoria e voglio eliminarli con uno script che verrà eseguito quotidianamente. Ma allo stesso tempo voglio evitare di uccidere il processo genitore che può anche rientrare nella categoria "sopra i 500000". Voglio usarlo per qualcos'altro ma come esempio sto mostrando l'albero iexplore.exe. iexplore

Due dei processi figlio violano la mia memoria max. Sono in grado di ucciderli tramite script, ma ho bisogno di mettere l'opzione fail safe nel caso in cui anche il processo padre superi il limite specificato e che non sono sicuro di come approcciare.

Questo è quello che ho finora. Il primo passo è ottenere tutti i processi di violazione:

Get-WmiObject -ComputerName $[list of servers] Win32_Process -Filter "name = '[app name]'" | Select-Object __Server,Name,@{Name='WorkingSet';Expression={[math]::Round(($_.WS/1MB),2)}},@{Name='VirtualMemory';Expression={[math]::Round(($_.VM/1MB),2)}} | Where-Object {$_.WorkingSet -gt $[my threshold]}

Il prossimo passo sarebbe fermarli.

Sarei grato per qualsiasi suggerimento.

Jules

Risposte:


1

Utilizzando WMI, è possibile ottenere l'ID ParentProcess del processo

gwmi -Class win32_process -Filter 'name like "%iexplore%"' | 
    select Name, ProcessID, ParentProcessID

Una nota a margine: sebbene improbabile nel caso iexplore, è del tutto possibile che un processo genitore si fermi e l'id venga riutilizzato da un altro processo.


Grazie, sarebbe utile se elencasse solo un parentprocessid ma nella maggior parte dei casi ce ne sono almeno due e anche quattro nel mio caso. Penso di aver bisogno di qualcosa che escluda l'arresto dei processi che hanno un processo figlio.
jules d,

0

Questo è un modo per creare quel tipo di elenco. Innanzitutto, archiviare tutti i PID per il nome del processo in questione in un array. Quindi filtrare l'elenco dei processi per includere solo quelli in cui il PID padre si trova anche in tale array. Questo funziona perché il genitore dei figli iexplore sarà un altro iexplore che si trova nella matrice PID, e il genitore del PRIMO processo iexplore era probabilmente Explorer, il cui PID non è in quella matrice.

$pids = (gwmi -Class win32_process -Filter 'name like "%iexplore%"' | select processid).processid
"PIDs"
$pids
"All Children"
gwmi -Class win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -in $pids } | select -prop commandline,processid
"Children > Size"
gwmi -Class win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -in $pids -and $_.ws -gt 500MB } | select -prop commandline,processid
"Parent(s)"
gwmi -Class win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -notin $pids } | select -prop commandline,processid

Si noti che non è possibile farlo con una singola pipeline che inizia con Get-WmiObject -ComputerName $[list of servers]. Ciò crea una singola raccolta di processi su più dispositivi. Non esiste alcuna relazione di processo padre tra processi su dispositivi diversi. Sarà necessario annidare l'enumerazione del processo all'interno di un ciclo che viene eseguito su ciascun server.

foreach ($server in $listOfServers) {
    $pids = (gwmi -comp $server win32_process -Filter 'name like "%iexplore%"' | select processid).processid
    # Report only, no kill
    gwmi -comp $server win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -in $pids -and $_.ws -gt 500MB } | select -prop commandline,processid
    # Kill, uncomment to enable
    # gwmi -comp $server win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -in $pids -and $_.ws -gt 500MB } | foreach { $_.terminate() }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.