[closed] [VBScript/JScript/SP-Forth]mem usage

Andbar

После сканирования лориеном ftp-сервера сервис начинает потреблять память (кеширует листинги чтоли?). Перезапускать его вручную - изаврат. Решил сделать задачу для nnCron, которая бы каждые 5 минут проверяла memory usage у соответствующего процесса и, при превышении размера выделяемой памяти 50Мб, ждала бы 5 минут и перезапускала сервис.
Однако, в справочнике по nnCron не нашел способа узнать memory usage нужного процесса, зато нашел возможность вставить VBScript/JScript.
Как можно на VBScript/JScript узнать, сколько памяти занимает процесс (идентифицируемый по имени, впрочем, можно и по ID (через nnCron можно узнать? Или мб. возможно написать на Форте функцию, определяющую memory usage (мои познания в этом языке ограничиваются написанием простейших скриптиков для nnCron)?
В инете не искал за неимением оного.

maggi14

Первое приближение:
Listing 1 WMI Script for Monitoring System Memory

1 strComputer = "."
2 Set objWMIService = GetObject("winmgmts:" _
3 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
4 set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
5 Set objMemory = objRefresher.AddEnum _
6 (objWMIService, "Win32_PerfFormattedData_PerfOS_Memory").objectSet
7 objRefresher.Refresh

8 Do
9 For Each intAvailableBytes in objMemory
10 If intAvailableBytes.AvailableMBytes < 4 Then
11 Wscript.Echo "Available memory has fallen below 4 megabytes."
12 End If
13 Next
14 objRefresher.Refresh
15 Loop

Listing 2 WMI Script for Monitoring CPU Threshold

1 strComputer = "."
2 Set objWMIService = GetObject("winmgmts:" _
3 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
4 set objRefresher = CreateObject("WbemScripting.Swbemrefresher")
5 Set objProcessor = objRefresher.AddEnum _
6 (objWMIService, "Win32_PerfFormattedData_PerfOS_Processor").objectSet
7 intThresholdViolations = 0
8 objRefresher.Refresh

9 Do
10 For Each intProcessorUse in objProcessor
11 If intProcessorUse.PercentProcessorTime > 90 Then
12 intThresholdViolations = intThresholdViolations + 1
13 If intThresholdViolations = 10 Then
14 intThresholdViolations = 0
15 Wscript.Echo "Processor usage threshold exceeded."
16 End If
17 Else
18 intThresholdViolations = 0
19 End If
20 Next
21 Wscript.Sleep 6000
22 objRefresher.Refresh
23 Loop

Дальше сам тыкай

Andbar

Свободную память я и так получу, а мне нужны данные по одному процессу (и не свободная память, а PrivateBytes). Что нужно задать, чтобы получать perfomance counter не для системы, а для одного процесса? Или где про это можно почитать (только не в инете, был бы инет - сам бы нашел).
Я пробовал изменять 1 и 3 строки:
strComputer = ".\Process(G6FTPServer)"
и, соотвественно:
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2\processes\G6FTPServer")
Оба варианта выдают ошибку.

0000

Вообщем что такое PrivateBytes понятия не имею. Вот скриптец, который для каждого процесса получает количество виртуальной памяти (колонка в Диспечере задач). За другими показателями процесса, можно слазить сюда - http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_pro... (собственно исходя из этого и написал).

strOut = ""
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colProcesses = objWMIService.ExecQuery( _
"select * from win32_process" )
For Each objProcess in colProcesses

If objProcess.GetOwner ( User, Domain ) = 0 Then
strOut = strOut & Chr (10) & Chr (13) & "Process " & _
objProcess.Caption & " VirtMemory, Kb " & objProcess.PrivatePageCount /1024
Else
strOut = strOut & Chr (10) & Chr (13) & "Problem " & Rtn & _
" getting the owner for process " _
& objProcess.Caption
End If
Next

MsgBox strOut

Andbar

О, спасибо.
Это как раз то, что нужно.
Оставить комментарий
Имя или ник:
Комментарий: