1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
1

Отправка уведомления при превышении процессом порога используемой памяти

23.04.2013, 15:38. Показов 6630. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
всем привет
не судите строго за незнание
задача была такая. написать батник который будет в tasklist.exe проверять определенный процесс и если его memusage будет превышать указанного значения отправлял уведомление.
ОС Вин2003
добиться этого результата не получилось
нашел ВБС который проверяет оставшиеся memusage. решил прикрутить его с батник и результат этого ВБС(переменную) сравнивать с заданным значением. и если значение больше переменной из ВБС(т.е. если оставшийся фри мемори) отправлял уведомление.
но в батнике это работать отказывается.
помогите разобраться с задачькой
заранее всем спасибо

1.vbs
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Option Explicit
Dim objWMIService, perfData, entry 
Dim strLogonUser, strComputer 
 
strComputer = "." 
 
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _ 
& strComputer & "\root\cimv2") 
Set perfData = objWMIService.ExecQuery _
("Select * from Win32_PerfFormattedData_PerfOS_Memory") 
 
For Each entry in perfData 
Wscript.Echo "Available memory bytes: " & entry.AvailableBytes
Next
 
WScript.Quit
1.bat

Bash
1
2
3
@ECHO OFF
setlocal enabledelayedexpansion
for /f "tokens=4 delims= " %%a in ('C:\windows\system32\cscript.exe //nologo D:\MEMCHK\1.vbs^') do (if 524288000 lss %%a 'start C:\windows\system32\cscript.exe //nologo D:\MEMCHK\smpp.vbs')

заранее всем спасибо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2013, 15:38
Ответы с готовыми решениями:

Запуск бат-файла при превышении физической памятью указанного порога
Хочу связать бат файл с физической памятью и что бы он включался только тогда - когда физическая...

Определение размера динамической памяти, используемой процессом
Доброго всем времени суток! В общем задача следующая... Я, с помощь функции CreateProcess() создаю...

Показать размер памяти, используемой конкретным процессом
Пытаюсь сделать программу которая будет показывать кол-во используемой памяти конкретным процессом....

Кто определяет максимальный размер используемой процессом памяти?
Доброго времени суток. Вопрос знатокам платформы .Net. Есть у процесса свойство...

23
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
23.04.2013, 16:12 2
Bash
1
2
3
4
5
@echo off
set app=calc.exe
::Макс. кол-во ОЗУ для процесса (в КБ.)
set MaxMem=2000
tasklist /FI "IMAGENAME eq %app%" /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH|Find /i "%app%"&& cscript.exe //nologo "D:\MEMCHK\smpp.vbs"
2
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
23.04.2013, 16:34  [ТС] 3
а если усложнить задачу и сделать так чтоб от в место конкретного апп в тасклисте проверял апп который использует больше указанного значение?
0
Модератор
Эксперт JS
5237 / 2110 / 416
Регистрация: 06.01.2013
Сообщений: 4,839
23.04.2013, 16:40 4
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от ncblx Посмотреть сообщение
а если усложнить задачу и сделать так чтоб от в место конкретного апп в тасклисте проверял апп который использует больше указанного значение?
Это упростить))
Строка нумер 5 станет такой
Bash
1
tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH|Find /i "*.exe"&& cscript.exe //nologo "D:\MEMCHK\smpp.vbs"
3
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
23.04.2013, 16:57  [ТС] 5
не ругайте меня строго
но еще есть такой вопрос
в smpp.vbs у меня скрипт который отправляет смс на указанные номера но отправляет только хостнем сервера. можно ли и его переделать так чтоб он отправлял IP и имя процесса который превышает указанное значение?
изза vbs новую тему открыть в нужном разделе или прям тут это и черкануть?

Заранее всем спасибо.
0
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
23.04.2013, 22:22 6
Цитата Сообщение от ncblx Посмотреть сообщение
открыть в нужном разделе
https://www.cyberforum.ru/vbscript-wsh/

Добавлено через 3 часа 48 минут
ncblx, простите, невнимательно прочитал.

Передача параметра в VBS из BAT и получение его в скрипте - можете в этой же теме спрашивать.
В общем случае в скрипте его получают через Wscript.Arguments(0) - см. последний код в посте: Тонкости языка, редкие команды и сложные скрипты
1
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
24.04.2013, 14:46  [ТС] 7
Спасибо вам огромное.
но вот изза не знания батч я не знаю теперь как мне в ниже указанном скритье сделать так чтоб в случае если указанное значение превышено, т.е. какой то определенный процесс превысил лимит и выполнился скрипт как вывести в самом батнике имя сервиса а потом еще его в писать в сам vbs.

Bash
1
2
3
4
5
@echo off
set app=notepad.exe
::Макс. кол-во ОЗУ для процесса (в КБ.)
set MaxMem=4000
tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH|Find /i "*.exe"&& cscript.exe //nologo "D:\MEMCHK\smpp.vbs"
вот содержимое самого smpp.vbs

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Set cloner = CreateObject("WScript.Shell")
cloner.run"cmd"
WScript.Sleep 500
 
Dim objNTInfo
Set objNTInfo = CreateObject("WinNTSystemInfo")
 
GetComputerName = lcase(objNTInfo.ComputerName)
 
 
 
cloner.SendKeys"telnet 10.13.44.122 80"
cloner.SendKeys("{Enter}")
WScript.Sleep 500
 
cloner.SendKeys""
cloner.SendKeys("{Enter}")
WScript.Sleep 500
 
cloner.SendKeys""
cloner.SendKeys("{Enter}")
WScript.Sleep 500
 
cloner.SendKeys"GET http://10.13.44.122/vas/sendsms.php?num=1,994702011360&text="&GetComputerName&" HTTP/1.0\r\n"
cloner.SendKeys("{Enter}")
WScript.Sleep 500
 
cloner.SendKeys""
cloner.SendKeys("{Enter}") 
WScript.Sleep 500
 
cloner.SendKeys""
cloner.SendKeys("{Enter}")
WScript.Sleep 500
 
 
cloner.SendKeys""
cloner.SendKeys("{Enter}")
WScript.Sleep 500
 
cloner.SendKeys"exit"
cloner.SendKeys("{Enter}")
WScript.Sleep 500
cloner.SendKeys"GET http://10.13.44.122/vas/sendsms.php?num=1,994702011360&text="&GetComputerName&" HTTP/1.0\r\n" - в этой строке указанна ссылка и параметры - т.е на какие номера отправлять смс сообщение и имя ПС(&GetComputerName&). вот эго и нужно подменить так чтоб он отправлял IP и имя самого процесса который превысил MaxMem

Заранее всем огромное спасибо
0
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
24.04.2013, 16:28 8
Bash
1
2
3
4
5
6
7
8
9
@echo off
SetLocal EnableExtensions
::Макс. кол-во ОЗУ для процесса (в КБ.)
set MaxMem=2000
for /f "delims=, tokens=1" %%a in (
  'tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH'
) do (
  start "" /WAIT cscript.exe //nologo "D:\MEMCHK\smpp.vbs" "%%~a"
)
Добавлено через 1 минуту
В скрипте в нужном месте:

Visual Basic
1
cloner.SendKeys Wscript.Arguments(0)
1
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
24.04.2013, 16:41  [ТС] 9
Это поможет указать имя процесса. а как быть с IP?

в нужном месте так должно быть?

Visual Basic
1
2
cloner.SendKeys"GET http://10.13.44.122/vas/sendsms.php?num=1,994702011360&text="&GetComputerName&"&
cloner.SendKeys Wscript.Arguments(0) HTTP/1.0\r\n"
0
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
24.04.2013, 17:11 10
Не знаю, как у Вас этот скрипт работает без ошибок. Вообще везде, где кавычки, должен быть хотя бы пробел стоять от предыдущей команды.

То, что Вы написали выше я вообще не понимаю. Возле знаков конкатенации & тоже должны стоять пробелы.
В конце 1-й строки у Вас такой знак стоит - ну и с чем он там соединяет - с пустотой?

На счет получения локального IP-адреса - открыл тему: Получение локального и внешнего IP-адресов
Отправлять/получать в VBS по такому же принципу: рядом дописываете еще один аргумент.
В скрипте получать через Wscript.Arguments(1)
1
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
24.04.2013, 17:41  [ТС] 11
поправьти меня. что я не так делаю?

Bash
1
2
3
4
5
6
7
8
@echo off
::set app=notepad.exe
::Макс. кол-во ОЗУ для процесса (в КБ.)
set MaxMem=4000
 
for /f "tokens=2" %%b in ('netsh interface ipv4 show addresses^|find "IP-"') do set LocIP=%%b
 
for /f "delims=, tokens=1" %%a in ('tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH') do (start "" /WAIT cscript.exe //nologo "D:\MEMCHK\smpp.vbs" "%%~a&&LocIP")
0
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
24.04.2013, 17:56 12
в конце 8-й строки:
Bash
1
(start "" /WAIT cscript.exe //nologo "D:\MEMCHK\smpp.vbs" "%%~a" "%LocIP%")
1
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
24.04.2013, 18:11  [ТС] 13
Обошли это по другому

в самом PHP который отсылает смс изменил код чтоб отправлял IP сервера

только вот теперь не могу разобраться как изменить сам VBS чтоб он отправлял имя сервиса

вот фрагмент VBS

Visual Basic
1
2
3
cloner.SendKeys"GET http://10.13.44.122/vas/sendsms.php?num=1,994702011360&text="&GetComputerName&" HTTP/1.0\r\n"
cloner.SendKeys("{Enter}")
WScript.Sleep 500
&text="&GetComputerName& в место этого прописывать %%~a из батника
0
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
24.04.2013, 22:27 14
При чем тут %%~a из батника?

Цитата Сообщение от Dragokas Посмотреть сообщение
В скрипте в нужном месте: Код Visual Basic1
Visual Basic
1
cloner.SendKeys Wscript.Arguments(0)
Цитата Сообщение от Dragokas Посмотреть сообщение
В скрипте получать через Wscript.Arguments(1)
1
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
24.04.2013, 22:49  [ТС] 15
Да не знаю я где его место =)
0
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
24.04.2013, 23:02 16
Вот так наверно:

Visual Basic
1
cloner.SendKeys "GET http://10.13.44.122/vas/sendsms.php?num=1,994702011360&text=" & GetComputerName & "_" & Wscript.Arguments(0) & " HTTP/1.0\r\n"
1
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
25.04.2013, 10:34  [ТС] 17
утром проверю и отпишусь
заранее спасибо

Добавлено через 8 часов 45 минут
Все заработало. огромное спасибо.

Добавлено через 7 минут
Теперь другая проблема
батник при запуске проверяет MemUsage
и если даже предел не превsшин он запускает VBS
а нужно было чтоб если MaxMem превsшин указанного значения но в этом случае запускался VBS

Добавлено через 12 минут
Этот батник будет запускаться автоматически каждую минуту. и при таких условиях будет каждую минуту отправлять смс.

а нужно чтоб он проверял и если MaxMem не превышен то просто делал exit
а если превышен запускал VBS

Bash
1
2
3
4
5
6
@echo off
::set app=notepad.exe
::Макс. кол-во ОЗУ для процесса (в КБ.)
set MaxMem=310000
for /f "delims=, tokens=1" %%a in ('tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH') do (if "%a% lss %MaxMem%" start "" /WAIT cscript.exe //nologo "D:\MEMCHK\smpp.vbs" "%%~a") 
else exit
Добавлено через 45 минут
Bash
1
2
3
4
5
6
7
@echo off
set MaxMem=350000
for /f "delims=, tokens=1" %%a in ('tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH') do set App=%%a
for /f "delims=, tokens=5" %%c in ('tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH') do set MemUsed=%%c
if %MemUsed% GTR %MaxMem% go to :step1 else exit
:step1 
start "" /WAIT cscript.exe //nologo "D:\MEMCHK\smpp.vbs" "%%~a"
Что то у меня совсем ничего не получается =( уже запутался =(

плз хелп ми

Добавлено через 23 минуты
Bash
1
2
3
4
5
6
7
@echo off
set MaxMem=150000
for /f "delims=, tokens=1" %%a in ('tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH') do (set App=%%a)
for /f "delims=, tokens=5" %%c in ('tasklist /FI "MEMUSAGE gt %MaxMem%" /FO CSV /NH') do (set MemUsed=%%c)
if %MemUsed% GTR %MaxMem% go to :step1 else exit
:step1 
start "" /WAIT cscript.exe //nologo "D:\MEMCHK\smpp.vbs" "%App%"
в таком случае работает. но если процессов несколько то отправляет название только одного. а остальные не отправляет

Добавлено через 14 минут
Нет не работает. все равно отправляет пустой смс.
а нужно чтоб если MaxMem превышен то отправлял смс. а если нет, то делал exit.
0
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
25.04.2013, 13:07 18
Цитата Сообщение от ncblx Посмотреть сообщение
Нет не работает.
И не будет. Приведенные выше варианты модифицированы с ошибками (вот как минимум одна - %a% - обычная переменная, %%a - переменная цикла.)

Цитата Сообщение от ncblx Посмотреть сообщение
Этот батник будет запускаться автоматически каждую минуту. и при таких условиях будет каждую минуту отправлять смс.
Т.е. батник слишком часто отправляет SMS?
Ну так и понятно. Вы изначально не сказали, что будете проверять все это добро циклически.
С точки зрения батника, он смотрит все процессы, которые превышают указанное число КБ, дальше команда SMS.
Процессы с завышенной памятью все еще остаются выполняться.
Естественно, через минуту батник опять рапортует про те же самые процессы.

Если нужно сделать фильтр, чтобы 2 раза не рапортовал об одном и том же процессе, я подумаю...
Делать?

Цитата Сообщение от ncblx Посмотреть сообщение
Этот батник будет запускаться автоматически каждую минуту.
Так пусть сам себя и запускает каждую минуту:

Bash
1
2
3
4
:begin
::ваш код
>nul ping 127.1 -n 61
goto begin
1
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 23
25.04.2013, 13:35  [ТС] 19
Все замечательно

но мне нужно чтоб он не работал в цыкле
а запускался через секджл каждую минуту.
проверял процессы. если есть процесс который потребляет больше памяти он выполнял vbs(отправлял смс с именим процесса) а если лимит не превышен то просто делать exit.
0
Эксперт WindowsАвтор FAQ
18013 / 7714 / 892
Регистрация: 25.12.2011
Сообщений: 11,496
Записей в блоге: 16
25.04.2013, 14:13 20
Он так и делает.
Код с постов №№ 11,12.
0
25.04.2013, 14:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2013, 14:13
Помогаю со студенческими работами здесь

Повторная отправка данных при превышении объема текста
На странице 5.php имеется код: * * * <form action="index.php?page=6" method="post"...

Загрузка процессора и памяти при включении процессом jawaws.exe
При включении ноутбука через некоторое время в диспетчере задач появилось 15000(!) процессов с...

Ошибка при попытке разыменовать указатель, который размещен в динамической памяти другим процессом
Доброго времени суток. Есть родительский процесс, он запускает через createProcess дочерний...

Увеличение используемой памяти
Здравствуйте! Есть сервер, на нём 24 Гб ОЗУ. Стоит Windows Server 2008 R2 64-бита. Система свежая....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru