Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Мониторинг Железа
Датчики температур
Кулера
Диски
Напряжение
и т.д.
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Артём Мамзиков »

Самое важное что нужно начинать мониторить это состояние железа! Смысл мониторить Операционную систему, работу программ и прочего если у вас умирает железо. Так что начнем мониторинг с железа его состояния!



Как работает скрипт разбор


Из Службы в Процесс Open Hardware Monitor


Разновидности Open Hardware Monitor и другие похожие утилиты
LibreHardwareMonitor
hwmonitor-pro
Разновидности OHM
Разновидности OHM
Windows: Rainmeter, GPU-Z, HWiNFO, AIDA64, Core Temp, Hardinfo, Sidebar Diagnostics, Real Temp.
MAC: iStat Menus, smcFanControl, Fan Control, AIDA64.

НОВАЯ ВЕРСИЯ 3.5 В ОТДЕЛЬНОЙ ВЕТКЕ Скрипт + Шаблон для Windows LLD Hardware Monitor
Авто Создание Триггеров, зависимостей, Графиков

Обнаруживаем все доступные датчик для Windows с помощью Open Hardware Monitor через скрипт который лежит на Zabbix Server. Шаблон зацепленный к узлу создает элементы которые доступны для проверки на узле с windows , далее напрямую запрашивается значение данного элемента прямо с узла. (Скрипт нужен только для обнаружения элементов)
Программка должна работать в виде службы Open Hardware Monitor (и закрыт сам Open Hardware Monitor.exe файл после настройки может мешать передаче данных службы) Ниже будет как сделать в виде службы.
OHM
OHM
Перезалил 16.12.2020 (добавлен шаблон и скрипт 3.4.1 для работы с портами кому нужно указать в макросе узла нужный порт)
Скачать Шаблон + Скрипт
Обнаружение датчиков Windows LLD OpenHardwareMonitor.zip
Обнаружение датчиков Windows LLD OpenHardwareMonitor.zip
(37.18 КБ) 244 скачивания
Скачать Шаблоны и скрипты
Скачиваем скрипт ложим его на заббикс сервер в моем случае путь такой
/usr/local/share/zabbix/externalscripts
Делаем импорт шаблона - Добавляем к узлу шаблон На удаленных узлах должен быть агент и OHM виде службы.

Скрипт работает на запрос CMD следующего запроса:
wmic.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor

Далее мы получаем таблицу и работает с ней выбирая нужные нам столбцы
CMD-OHM
CMD-OHM
Подробнее Команда WMIC – выполнить сценарий WMI в командной строке
Образец таблицы с данными
Показать
C:\Windows\System32>WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor
Identifier Index InstanceId Max Min Name Parent ProcessId SensorType Value
/lpc/it8620e/voltage/0 0 3872 1,38 1,284 Voltage #1 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 1,356
/amdcpu/0/clock/2 2 3854 4200,022 4000,004 CPU Core #2 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/ram/load/0 0 3864 95,32287 42,7315 Memory /ram 6805950c-324c-4724-8f79-308e888c3472 Load 60,58934
/amdcpu/0/clock/3 3 3855 4200,021 4099,883 CPU Core #3 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/load/2 2 3845 100 4,6875 CPU Core #2 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 56,25
/lpc/it8620e/voltage/3 3 3875 1,848 1,848 Voltage #4 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 1,848
/ram/data/0 0 3865 3,319126 1,487904 Used Memory /ram 6805950c-324c-4724-8f79-308e888c3472 Data 2,109711
/lpc/it8620e/voltage/6 6 3878 2,232 2,22 Voltage #7 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 2,232
/lpc/it8620e/voltage/4 4 3876 1,992 1,98 Voltage #5 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 1,992
/amdcpu/0/load/7 7 3850 100 0 CPU Core #7 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 17,1875
/lpc/it8620e/control/0 0 3840 0 0 Fan Control #1 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Control 0
/amdcpu/0/load/8 8 3851 100 0 CPU Core #8 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 9,677422
/amdcpu/0/clock/8 8 3860 4200,015 1400,004 CPU Core #8 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/clock/4 4 3856 4200,022 4000,013 CPU Core #4 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/load/3 3 3846 100 0 CPU Core #3 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 35,9375
/amdcpu/0/clock/5 5 3857 4200,02 1400,004 CPU Core #5 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/load/4 4 3847 100 6,153846 CPU Core #4 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 50
/lpc/it8620e/voltage/5 5 3877 2,232 2,22 Voltage #6 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 2,232
/amdcpu/0/load/0 0 3852 100 16,99219 CPU Total /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 30,59336
/lpc/it8620e/control/2 2 3842 0 0 Fan Control #3 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Control 0
/amdcpu/0/clock/1 1 3853 4200,022 4099,883 CPU Core #1 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/clock/0 0 3862 200,0044 199,9943 Bus Speed /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 200,0007
/lpc/it8620e/voltage/1 1 3873 1,5 1,488 Voltage #2 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 1,5
/lpc/it8620e/control/1 1 3841 0 0 Fan Control #2 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Control 0
/lpc/it8620e/fan/0 0 3884 2385,159 2335,64 Fan #1 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Fan 2368,421
/ram/data/1 1 3866 1,99408 0,1628571 Available Memory /ram 6805950c-324c-4724-8f79-308e888c3472 Data 1,372272
/lpc/it8620e/voltage/8 8 3880 2,784 2,784 VBat /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 2,784
/lpc/it8620e/temperature/1 1 3882 55 38 Temperature #2 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Temperature 43
/lpc/it8620e/temperature/0 0 3881 34 33 Temperature #1 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Temperature 33
/hdd/0/load/0 0 3870 39,86851 39,85644 Used Space /hdd/0 6805950c-324c-4724-8f79-308e888c3472 Load 39,86786
/lpc/it8620e/voltage/2 2 3874 2,052 2,04 Voltage #3 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 2,04
/amdcpu/0/load/1 1 3844 100 3,125 CPU Core #1 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 31,25
/amdcpu/0/clock/6 6 3858 4200,016 1400,004 CPU Core #6 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/temperature/0 0 3861 52,75 32,5 Core #1 - #8 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Temperature 34,125
/amdcpu/0/load/5 5 3848 100 0 CPU Core #5 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 14,28571
/amdcpu/0/clock/7 7 3859 4200,016 1400,004 CPU Core #7 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/load/6 6 3849 100 0 CPU Core #6 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 30,15873
/lpc/it8620e/voltage/7 7 3879 3,312 3,312 Standby +3.3V /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 3,312
/hdd/0/temperature/0 0 3869 31 29 Temperature /hdd/0 6805950c-324c-4724-8f79-308e888c3472 Temperature 30
/lpc/it8620e/temperature/2 2 3883 69 48 Temperature #3 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Temperature 50

Столбцы
Identifier - путь до устройства датчика
Index - индекс повторяются
*InstanceId - идентификатор_экземпляра ИД
Max - максимальные значения
Min - минимальное значение
*Name - Имя датчика
Parent - родитель сокращенный (неполный путь) путь от Identifier
Processid - ИД Процесса
*SensorType - Вид датчика (Voltage Напряжение V;
Clock время MHz;
Load загрузка %;
Data Данные GB;
Control управление %,
Fan вентилятор RPM;
Temperature температура C
*Value - показатели значения

[key] string ProcessId;
[key] string InstanceId;
string SensorType;
string Identifier;
string Parent;
string Name;
real32 Value;
real32 Min;
real32 Max;
sint32 Index;

Нам надо для заббикса
Имя: Датчик $SensorType $Name
Единица измерения: $SensorTyp
Новая группа элементов данных: $SensorTyp
С Заббикс сервера можно запросить данную таблицу командой:
zabbix_get -s IP-Хоста -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor"]
Еще примеры команд
Показать

Запрос всей таблицы датчиков (сенсоров)
WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor

Запрос железа
WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Hardware

CMD
В индификатор можно подставить данные из первого столбца а ответ мы хотим из 2х столбцов
WMIC /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "Identifier='/amdcpu/0/temperature/0'" GET Max, Min
Max Min
56,75 31,75

Получаем имя датчика для ИД 3882
WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId='3882'" GET Name
Name
Temperature #2

Получаем категорию/группу датчиков для ИД 3882
WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId='3882'" GET SensorType
SensorType
Temperature

Сюда подставить ID 3882 датчика и получим значение из последнего столбца
WMIC /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId='3882'" GET Value
Value
49

Запросы из терминала Linux на заббикс сервере через команду zabbix_get -s

Запрос всей таблицы (где есть кавычки " ставим до слешь \)
zabbix_get -s 172.16.121.7 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor"]

Запрос железа
zabbix_get -s 172.16.121.7 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Hardware"]

Пример как будет выглядеть элемент узла запрос для id датчика 3882
zabbix_get -s 172.16.121.7 -p 10050 -k system.run['WMIC /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId='3882'" GET Value']
Ответ надо сделать пред обработку (обрезать слева Value) и останется ток значение
Value
43

Получаем число без обрезки Шаблоне нужно выбрать с плавающей точкой, иначе длинные числа выходят как строка если выбрать целое положительное значение
root@ZABBIXSERVER:~# zabbix_get -s 172.16.121.7 -p 10050 -k wmi.get["root\OpenHardwareMonitor","SELECT Value FROM Sensor WHERE "InstanceId='3882'""]
45.000000
zabbix wmi.get.jpg
zabbix wmi.get.jpg
Специфичные ключи элементов данных для Windows

Пример запроса из стандартных средств производитель материнки
root@ZABBIXSERVER:~# zabbix_get -s 172.16.121.7 -p 10050 -k wmi.get["root\cimv2","SELECT Vendor FROM Win32_ComputerSystemProduct"]
Gigabyte Technology Co., Ltd.

Элемент для шаблона заббикс
Рабочий
wmi.get[root\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3882]

Имя Датчик {#SENSORTYPE} Имя {#NAME} ИД {#ID}
Тип Zabbix agent
Ключ wmi.get[root\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId={#ID}]
Тип Информации Числовой с плавающей точкой
Единица измерения {#SENSORTYPE} интервал обновления 300
Было бы не плохо присвоить группы из переменой {#SENSORTYPE} но нет переменные для групп не работают

Элемент тестовый не работает в шаблоне
WMIC.exe["/NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor WHERE \"InstanceId=3882\" GET Value"]
WMIC.exe["/NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor WHERE \"InstanceId={#InstanceId}\" GET Value"]
чтобы прошли кавычки " в команду, надо их передать со слешем \" вот так, иначе они экранируют строку от пробелов
Сделать предобработку убрав слово Value и переход на новую строку \n чтобы получить значение


powershell
get-wmiobject msacpi_thermalzonetemperature -namespace "root/wmi"

так же можно скачать утилиту WMI Code Creator - утилита просмотра 900КБ
и просмотреть данные и составить команды
WMI Code Creator 2
WMI Code Creator 2
WMI Code Creator
WMI Code Creator
Если вам интересны еще другие команды для wmic данной программке можно покопаться в Исходниках OHM

Можно конечно запрашивать данные напрямую без доп программ через wmic , но тогда команды будут разными, на разные группы элементов и разное железо или вообще в целом индивидуальные. Это не удобно тут же уже собрано все в одном месте в OpenHardwareMonitor в бесплатной с открытым исходном коде программке. Так же можете взять за образец и запилить скрипт по другую программку.
Пример прямой команды wmic /namespace:\\root\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature


В 2х статьях ниже можно посмотреть как сделать openhardwaremonito в виде службы, в первом подробно во вторам само ставится скриптом.
Изначально было сделано и остается мониторинг через эту же утилиту но скрипт лежит на узле и работает при помощи powershell Спасибо данному разработчику данной статьи Zabbix: LLD-мониторинг железа под Windows на PowerShell
Так же написан скрипт который уже сам все ставить для powershell остается только раскомментировать датчики убрав в именах # данной программки Установка Агента Zabbix + Аппаратное обеспечение Windows

Захотелось сделать без использования powershell на основе cmd и скриптов на самом узле упростить в некотором роде задачу по сбору температуры в основном и других доп данных (хотя некоторые уже и так с агента известны например по загрузке проца и оперативки)

Что мы хотим получить:?
Самое главное это 3 столбец с ID (InstanceId) с помощь его мы сможем узнать напрямую одной командой значение Value
Далее мы же хотим знать к какой группе относится датчик и что это за датчик? Для этого используем предпоследний столбец 9 SensorType
Последний параметр Хотим знать имя датчика, а то данные есть, а откуда они что за датчик это у нас 6 столбец Name

Проблемы которые мы получаем в том что таблица состоит из пробелов без табуляции и это пол беды вся проблема в 6 столбце Name так как в именах есть пробелы и awk думает что это следующий столбец

На выходе из таблицы мы должны получить следующий вид результата например для узла 172.16.121.7
Запускаем скрипт ./OHM.sh 172.16.121.7 discovery
script-OHM
script-OHM
Или можно включить фильтрацию по решетке если решетка есть в имени (строке данную строку пропускаем для этого в скрипте нужно закоментировать одну строку и раскоментировать другую!
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
Использована команда |sed -E '/#/d' - которая пропускает все строки с # и не выводит их
OHM вывод разница #
OHM вывод разница #
# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
Использована команда |grep -E 'Temperature|Voltage'| - пишите сюда какие строки нужно оставить с каким содержанием слова
OHM вывод разница отдельные датчики
OHM вывод разница отдельные датчики
Нам нужно получить данные следующего вида из скрипта
Подробнее о Низкоуровневое обнаружение (LLD)
./OHM.sh 172.16.121.7 discovery
Показать
{"data":[
{"{#INSTANCEID}":"3872", "{#NAME}":"Voltage #1", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3854", "{#NAME}":"CPU Core #2", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3864", "{#NAME}":"Memory", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3855", "{#NAME}":"CPU Core #3", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3845", "{#NAME}":"CPU Core #2", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3875", "{#NAME}":"Voltage #4", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3865", "{#NAME}":"Used Memory", "{#SENSORTYPE}":"Data"},
{"{#INSTANCEID}":"3878", "{#NAME}":"Voltage #7", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3876", "{#NAME}":"Voltage #5", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3850", "{#NAME}":"CPU Core #7", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3840", "{#NAME}":"Fan Control #1", "{#SENSORTYPE}":"Control"},
{"{#INSTANCEID}":"3851", "{#NAME}":"CPU Core #8", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3860", "{#NAME}":"CPU Core #8", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3856", "{#NAME}":"CPU Core #4", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3846", "{#NAME}":"CPU Core #3", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3857", "{#NAME}":"CPU Core #5", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3847", "{#NAME}":"CPU Core #4", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3877", "{#NAME}":"Voltage #6", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3852", "{#NAME}":"CPU Total", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3842", "{#NAME}":"Fan Control #3", "{#SENSORTYPE}":"Control"},
{"{#INSTANCEID}":"3853", "{#NAME}":"CPU Core #1", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3862", "{#NAME}":"Bus Speed", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3873", "{#NAME}":"Voltage #2", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3841", "{#NAME}":"Fan Control #2", "{#SENSORTYPE}":"Control"},
{"{#INSTANCEID}":"3884", "{#NAME}":"Fan #1", "{#SENSORTYPE}":"Fan"},
{"{#INSTANCEID}":"3866", "{#NAME}":"Available Memory Data", "{#SENSORTYPE}":"Data"},
{"{#INSTANCEID}":"3880", "{#NAME}":"VBat", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3882", "{#NAME}":"Temperature #2", "{#SENSORTYPE}":"Temperature"},
{"{#INSTANCEID}":"3881", "{#NAME}":"Temperature #1", "{#SENSORTYPE}":"Temperature"},
{"{#INSTANCEID}":"3870", "{#NAME}":"Used Space", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3874", "{#NAME}":"Voltage #3", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3844", "{#NAME}":"CPU Core #1", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3858", "{#NAME}":"CPU Core #6", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3861", "{#NAME}":"Core #1 - #8", "{#SENSORTYPE}":"Temperature"},
{"{#INSTANCEID}":"3848", "{#NAME}":"CPU Core #5", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3859", "{#NAME}":"CPU Core #7", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3849", "{#NAME}":"CPU Core #6", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3879", "{#NAME}":"Standby +3.3V", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3869", "{#NAME}":"Temperature", "{#SENSORTYPE}":"Temperature"},
{"{#INSTANCEID}":"3883", "{#NAME}":"Temperature #3", "{#SENSORTYPE}":"Temperature"}
]}

Небольшое отличие 3 версии от 4 в примерах но это не суть
zabbix JSON data discovery
zabbix JSON data discovery
Пример для одной строки данных можно Важно переменная прописывается заглавными буквами иначе Заббикс сервер не примет
{"data":[
{"{#ИМЯ ПЕРЕМЕННОЙ}":"Данные переменной", "{#NAME}":"Voltage #1", "{#SENSORTYPE}":"Voltage"}
]}

или можно так для одной переменной с данными

{"data":[
{"{#ИМЯ ПЕРЕМЕННОЙ}":"Данные переменной"}
]}
За основу взял свой же скрипт но от Linux Скрипт + Шаблон для Linux LLD LM-Sensors

Первая Версия Скрипта OHM.sh
Плюсы + данной версии
1 раз делаем запрос на хост получаем всю таблицу
Делаем сразу обработку оставляя 3 нужных нам столбца
В цикл уже для построчной обработки нам попадает всего 3 столбца (массив данных меньше проще обрабатывать)

Минус -
Нельзя допускать более одного пробела в имени датчика! Если будет 2 пробела в имени датчика сместится последний 9 столбец т е это будет 8 или 7 и в 6 столбце будет не полное имя. (Почему так потому что между 2 таблицами как раз таки есть только 2 пробела Index InstanceId Max и если настроить параметр скрипта чтоб он начинал учитывать от 3х пробелов столбцы эти 2 столбца вылетают поэтому тут заданно от 2х пробелов sed -E 's/ (
Почему нельзя сделать так запросить предпоследний столбец через $(NF-1) (можно 9 так $(NF-2)но последняя строка, с таблицы работает не так как надо т е когда делаем табуляцию добавляется еще что то в конец таблицы и выходит не NF-1 ,а NF-2. А на последней строке этого нет и для нее надо NF-1)
Так что не делайте по 2 пробела в имени и у вас все будет Хорошо с этим скриптом)))
Так же нельзя использовать переменную для групп все датчики попадают в одну группу
Триггер придется создавать вручную для элементов или сделать получать только температурные датчики и задать триггер, но для меня это не удобно так как тут и проц каждое ядро и материнка и жесткий. Я делаю вручную все ядра температуры в один триггер и если хотя один превысит сработает триггер всего один. По графикам та же ситуация либо на каждый элемент авто создание либо вручную на группу элементов.
script-OHM V1.0
script-OHM V1.0
При копирования скрипта проверить 2 пробела 's/ (
Скрипт OHM.sh
Показать
#!/bin/bash
#2019/11/28 v1.0
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту Скрипт + Шаблон для Windows LLD Open Hardware Monitor

#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info

IFS=$'\n'
JSON="{\"data\":["
SEP=""

if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor

# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')

# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')

# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')

#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"

fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)

#else
if [[ $2 = "info" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $2 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi
Как создавался скрипт V1.0
Показать
Первая проблемка была в запросе с двойным слешем \\ он передавался один \ и ничего не работало все из за " двойных кавычек это тонкости на bash
сделано так get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`

Далее проблема с обработкой таблицы 6 столбца
$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')

Если на get в ответ пришло 2 ошибка то 2>/dev/null все черную дыру) дальше ничего не делаем, если все гуд то
awk NR\>1 - удаляем первую строку шапку таблицы наименование столбцов
sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;' | cat -vt - Поиск строк более чем 2 пробела, за которой следовал не пробел, добавил разделители табуляции, обработка первой строки данных Подсмотрено тут
с включеной -e опции
sed 's/было/стало/g' преобразование текста
s/ - тут 2 пробела
/t - горизонтальная табуляция;
подсмотрено тут)

|awk -F\\t '{print $3" "$6" "$9}' -Вывод 3 6 и 9 таблицы
Почему нельзя сделать так запросить предпоследний столбец через $(NF-1) (можно 9 так $(NF-2)но последняя строка, с таблицы работает не так как надо т е когда делаем табуляцию добавляется еще что то в конец таблицы и выходит не NF-1 ,а NF-2. А на последней строке этого нет и для нее надо NF-1)
$(NF) - последний столбец $(NF-1) - предпоследний и т.д.

Так же была попытка сделать так жестко задать ширину столбцов Обратите внимание на 2 пробела между 2 таблицами!
Identifier Index InstanceId Max Min Name Parent ProcessId SensorType Value
10 + 18 5 + 2 10+2 3 + 7 3+8 4+14 6 +8 9+29 10+3 5+3?
Ширина столбов с пробелами
1 28 символов
2 7 символов
3 12 символов
4 10 символов
5 11 символов
6 18 символов
7 14 символов
8 38 символов
9 13 символов
10 8 символов

get1=$(echo "${get}" 2>/dev/null|awk NR\>1|awk 'BEGIN{FIELDWIDTHS="28 7 12 10 11 18 14 38 13 8"}{print $3" "$6" "$9}')

Но как показала практика опять же 6 столбец отличается в ширине где имя длине столбец расширяется и жестко заданные поля уже не подходят(

Далее вариант был а не расчитать ли ширину каждого столбца с пробелами для каждого хоста индивидуально и передать переменными

#awk NR==1|awk '{print $1}'|wc -m)
#kss=$ awk '{print $1" "$2" "length() }') "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "$10"
#get1=$(echo "${get}" 2>/dev/null|awk NR\>1|awk 'BEGIN{FIELDWIDTHS="$kss"}{print $3" "$6" "$9}')
Но тут получилось высчитать число символов все строки, число текста все строки без пробелов, число названия одной какой то таблицы но чтоб посчитать каждый столбец с пробелами ширину нет.
Можно было попробовать узнать пробелы после имен таблиц высчитать пробелы сложить их с длиной имен получить ширину столбцов циклами но слишком много операция ради такого действия.

Вообщем пришли к такому решению описанному выше
$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')

Далее запускается цикл for обработки построчно и передачу в переменные и формирование общей data
fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2шаг каждый столбец идет для своей переменной
# Получаем Индифиционные номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'sed '|s/[ \t]*$//')
sed 's/[ \t]*$//' -Удалить все пробелы и символы табуляции в конце каждой строки файла (смотрите примечание по табуляции в конце документа) или можно убрать все пробелы удалить в имени все слитно будет tr -d ' '
разные примеры команд
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
JSON=$JSON"$SEP{\"{#InstanceId}\":\"$InstanceId\", \"{#Name}\":\"$Name\", \"{#SensorType}\":\"$SensorType\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"]}"
echo $JSON

Не создавались элементы писал что уже существует не шли переменные хотя вроде data выходила нормальной оказалось бонально
Cannot create item: item already exists
Надо было заглавными
Было JSON=$JSON"$SEP\n{\"{#InstanceId}\":\"$InstanceId\", \"{#Name}\":\"$Name\", \"{#SensorType}\":\"$SensorType\"}"
стало JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\"}"

В элементе wmi.get[root\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId={#ID}]
Было выставлено целое положительно число заработали не все элементы, выдало что строка, где длинное значение вылечилось значение с плавающей точкой.
Шаблон V1.0
Шаблон V1.0
Шаблон Элемент V1.0
Шаблон Элемент V1.0
Шаблон Элементы узла V1.0
Шаблон Элементы узла V1.0
В скрипте 2.0 выходить очень много запросов на хост это нагрузка как на сервер так и на удаленный узел и сеть, плюс это скрипт не доделанный не рабочий так оставлен
Скрипт V 2.0
Скрипт OHM2.sh
Показать
#!/bin/bash
#2019/11/28 v2.0
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)

#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info

IFS=$'\n'
JSON="{\"data\":["
SEP=""

if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor

# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Оставляем только 3 таблицу с ID InstanceId
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|awk '{print $3}')

# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|awk '{print $3}')

#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"

fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг для каждого ID элемента запрашиваем имя и категорию
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков
Name=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId=${InstanceId}" GET Name"]`
# Получаем категорию/группу датчиков
SensorType=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId=${InstanceId}" GET SensorType"]`
JSON=$JSON"$SEP{\"{#InstanceId}\":\"$InstanceId\", \"{#Name}\":\"$Name\", \"{#SensorType}\":\"$SensorType\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"]}"
echo $JSON

# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например за$

#else
#if [[ $2 = "info" ]]
#then
#get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
#for out in $get
#do
#echo "${out}"
#done
#elif [[ $2 = "maxtemp" ]]
#then
#get1=
#maxc=
#for out in $maxc
#do
#do
#echo $out
#done
#fi
Скрипт V3.0
Тут мы получим Имена: Тип оборудования и Имя оборудования будет более понятно в элементе что есть что но понятно это дает немного нагрузки на доп обработку скриптом тут уже вам решать использовать V1.0 или V3.0
Используются обе таблицы Sensor (как в скрипте V1.0) и добавлена 2 таблица Hardware
В начале скрипта запрашиваем обе таблицы, Hardware обрабатываем и оставляем 1 2 4 столбцы.

Далее будем сравнивать из 1 таблицы Sensor Столбец Parent , а во 2 таблице Hardware столбец Identifier

В цикл добавляем из первой таблицы Sensor Столбец Parent

Далее в цикл
добавляем вывод 2 таблицы Hardware в ней ищем строки содержащие $Parent и оставляем 1 столбец
так же делаем для (4) в нашем же случае это 3 столбец он же последний, он содержит пробелы в именах по этому делаем не учитывать один пробел все аналогично первому столбцу.
OHM 2 таблицы
OHM 2 таблицы
OHMV3.0script
OHMV3.0script
Выход скрипта V3.0
Выход скрипта V3.0
Scripts-OHM-V3.0.sh
Показать
#!/bin/bash
#2019/12/03 v3.0
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту Скрипт + Шаблон для Windows LLD Open Hardware Monitor

#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info

IFS=$'\n'
JSON="{\"data\":["
SEP=""

if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor

# Запрос имен и типа железа
gethd=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`

# Оставляем нужные нам слобцы по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')

# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')

# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')

# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')

#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"

fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования
HardwareType=`echo "${obrtablhd}"|grep -E "${Parent}"|awk '{print $1}'`
# Получаем имя железа (NF или $3)
Namehd=$(echo "${obrtablhd}"|grep -E "${Parent}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')

JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)

#else
if [[ $2 = "info" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $2 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi
В чем отличие скрипта 3.0 от 1.0
Показать
Добавлено
# Запрос имен и типа железа таблицы
gethd=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`

# Оставляем нужные нам слобцы 1 2 и 4 по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')
переменая = выводим таблица железом еасли ошибка в черную дыру | вырезаем шапку таблицы |учтываем столбцы от 2х пробелов делаем табуляцию | выводим 1 2 и 4 столбец
Дальше уже учитаваем их как 1 2 и 3 столбец

Добавляем 7 столбец в вывод сенсора
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')

Добавляем в цикл for
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-1)}'` выводим предпоследний $7 столбец построчно

и для второй таблицы
# Получаем Тип оборудования
HardwareType=`echo "${obrtablhd}"|grep -E "${Parent}"|awk '{print $1}'`
Переменая = вывод 2 таблицы железа 3х столбцов | поиск строк содержащие данные из 7 столбца совпали | выводим построчно 1 столбец 2 таблицы железа
# Получаем имя железа (NF или $3)
Namehd=$(echo "${obrtablhd}"|grep -E "${Parent}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
Переменая = вывод 2 таблицы железа 3х столбцов | поиск строк содержащие данные из 7 столбца совпали |добавляем табуляцию для структуры таблицы так как в столбце в именах есть пробелы учитываем для таблицы от 2х пробелов | выводим построчно 3 последний столбец 2 таблицы железа

Добавляем элементы вывод
JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\"}"

Все остальное идентично скрипту V1.0

Скрипт версии 3.1 Добавлено унаследовать родитель для датчиков если он есть
OHM3.1.sh
Показать
#!/bin/bash
#2019/12/04 v3.1
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту Скрипт + Шаблон для Windows LLD Open Hardware Monitor

#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info

IFS=$'\n'
JSON="{\"data\":["
SEP=""

if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor

# Запрос имен и типа железа
gethd=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`

# Оставляем нужные нам слобцы по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')

# Выбираем родителя датчика который показывает параметры смотрим 2 и 5 таблицу
tablparent=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$5}')

# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')

# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')

# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')

#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"

fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования
HardwareType=`echo "${obrtablhd}"|grep -E "${Parent}"|awk '{print $1}'`
# Получаем имя железа (NF или $3)
Namehd=$(echo "${obrtablhd}"|grep -E "${Parent}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 4 столбец (хотя в 4 попадет 5) в сравнении со столбцом-7 1-таблицы получаем ответ 4 столбца 2 таблицы
sopost=`echo "${tablparent}"|grep -E "${Parent}"|awk '{print $2}'`
# Во второй таблице ищем соответсвие к имени из параметра выше
roditel=$(echo "${obrtablhd}"|grep -E "${sopost}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Тип родителя
rodtip=`echo "${obrtablhd}"|grep -E "${sopost}"|awk '{print $1}'`

JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)

#else
if [[ $2 = "info" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $2 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi
Изменения в 3.1
Показать
Добавлено

# Выбираем родителя датчика который показывает параметры смотрим 2 и 5 столбцы 2 таблицы железа
tablparent=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$5}')

В цикл добавлено

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 4 столбец (хотя в 4 попадет 5) в сравнении со столбцом-7 1-таблицы получаем ответ 4 столбца 2 таблицы
sopost=`echo "${tablparent}"|grep -E "${Parent}"|awk '{print $2}'`
# Во второй таблице ищем соответсвие к имени из параметра выше
roditel=$(echo "${obrtablhd}"|grep -E "${sopost}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Тип родителя
rodtip=`echo "${obrtablhd}"|grep -E "${sopost}"|awk '{print $1}'`

sopost= выводим 2 таблицу с железом 2 и 5 стобец, ищем стороки в цикле совпадающие с 1 таблицей 7 столбцом Parent и выводим совпадения столбца 2. Т.е. это 2 таблица железа столбец 5 (Parent) сюдаже попадет последний столбец если предыдущий пустой но это нам не мешает

roditel= выводим 2 таблица железа 1 2 и 4 столбец ищем там совпадения из sopost (это у нас таже таблица столбец Parent сам собой он совпасть не может так как 5 столбец не выводится) далее у нас в именах есть пробелы опять применяем табуляцию и найденые совпадения выводи послдений столбец это у нас Name таблицы железа обрезаем в конце пробел

rodtip= выводим 2 таблица железа 1 2 и 4 столбец ищем там совпадения из sopost (это у нас таже таблица столбец Parent сам собой он совпасть не может так как 5 столбец не выводится) и выводим совпадения показать 1 столбец таблицы 2 железа

Все это у нас в цикле перебирается для каждого ID первой таблицы

Ну и добавляем это все вывод Получаем более полную картину что от куда, но и нагрузка возрастает на обработку
JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\"}"
ScriptOHM3.1
ScriptOHM3.1
Выход скрипта V3.1
Выход скрипта V3.1
Элементы OHM3.1
Элементы OHM3.1
Данные OHM3.1
Данные OHM3.1
Скрипт версии 3.3 (разделены процессоры если их больше 1 сделан вывод материнской платы)
возможно это был глюк один номер id на 2 проца но разные ид процесса сейчас уже все отображается корректно но зависимость добавлена на такой случай.
Имена 2 проца OpenHardwareMonitor V3 3
Имена 2 проца OpenHardwareMonitor V3 3
Изменения в шаблоне 03.2020 добавлено прототип группы в прототипе элемента
OHM прототип груп
OHM прототип груп
Последний раз редактировалось Артём Мамзиков Пн янв 27, 2020 17:46, всего редактировалось 14 раз. количество слов: 3890
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Артём Мамзиков »

OHM3.3.sh
Показать
#!/bin/bash
#2019/12/07 v3.3
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=71&p=121#p121

#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info

IFS=$'\n'
JSON="{\"data\":["
SEP=""

if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor

# Запрос имен и типа железа
gethd=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`

# Оставляем нужные нам слобцы по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')

# Пришлось сделать отдельную переменую так как в родитель попадает параметр Процесс ИД когда столбец родитель пустой
# С последним столбцом по железу (делаем между ними 2 пробела)
obrhartabl=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4" "$5" "$6}')

# Выбираем родителя датчика который показывает параметры смотрим 2 и 5 таблицу
tablparent=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$5}')

# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"

fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-2)}'`
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ(
Processid=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования работа со 2 таблицей
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3)
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 5 столбец (хотя в 5 попадет 6) в сравнении со столбцом-7 1-таблицы получаем ответ 5 столбца 2 таблицы
sopost=`echo "${tablparent}"|grep -E "${Parent}"|awk '{print $2}'`
# Во второй таблице ищем соответсвие к имени из параметра выше
roditel=$(echo "${obrtablhd}"|grep -E "${sopost}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Тип родителя
rodtip=`echo "${obrtablhd}"|grep -E "${sopost}"|awk '{print $1}'`

# Модель Материнской платы выволить всегда mainboard
#mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi

JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\", \"{#MAINBOARD}\":\"$mainboard\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)

#else
if [[ $2 = "info" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $2 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi
команды
Показать
#!/bin/bash
if [ -n "$num" ]; then
"переменная что-то имеет и можно запустить другой процесс"
else
echo "пустая переменная, останавливаем скрипт"
exit 0;
fi

-z строка пуста
-n строка не пуста
=, (==) строки равны
!= строки неравны
-eq равно
-ne неравно
-lt,(< ) меньше
-le,(<=) меньше или равно
-gt,(>) больше
-ge,(>=) больше или равно
! отрицание логического выражения
-a,(&&) логическое «И»
-o,(||) логическое «ИЛИ»
Изменения в 3.3
Показать
С таблицы 1 добавляем 8 столбец
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

С таблицы 2 по железу добавляем столбец 5 и 6
# Пришлось сделать отдельную переменую так как в родитель попадает параметр Процесс ИД когда столбец родитель пустой
# С последним столбцом по железу (делаем между ними 2 пробела)
obrhartabl=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4" "$5" "$6}')

# Получаем Тип оборудования работа со 2 таблицей
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3)
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

Сдвигаем вывод столбцов
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-2)}'`

Новая переменная
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ(
Processid=`echo "${element}"|awk '{print $(NF-1)}'`

# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi
Скрипт V3.4 Добавлено единицы измерения в зависимости от категории датчика
OHM3.4.sh
Показать
#!/bin/bash
#2019/12/14 v3.4
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=71&p=121#p121

#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info

IFS=$'\n'
JSON="{\"data\":["
SEP=""

if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor

# Запрос имен и типа железа
gethd=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`

# Оставляем нужные нам слобцы по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')

# Пришлось сделать отдельную переменую так как в родитель попадает параметр Процесс ИД когда столбец родитель пустой
# С последним столбцом по железу (делаем между ними 2 пробела)
obrhartabl=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4" "$5" "$6}')

# Выбираем родителя датчика который показывает параметры смотрим 2 и 5 таблицу
tablparent=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$5}')

# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"

fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-2)}'`
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ(
Processid=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования работа со 2 таблицей
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3)
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 5 столбец (хотя в 5 попадет 6) в сравнении со столбцом-7 1-таблицы получаем ответ 5 столбца 2 таблицы
sopost=`echo "${tablparent}"|grep -E "${Parent}"|awk '{print $2}'`
# Во второй таблице ищем соответсвие к имени из параметра выше
roditel=$(echo "${obrtablhd}"|grep -E "${sopost}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Тип родителя
rodtip=`echo "${obrtablhd}"|grep -E "${sopost}"|awk '{print $1}'`

case $SensorType in
*Clock*)
UINTS="MHz"
;;
*Load*|*Control*)
UINTS="%"
;;
*Temperature*)
UINTS="°C"
;;
*Data*)
UINTS="GB"
;;
*Fan*)
UINTS="RPM"
;;
*Voltage*)
UINTS="V"
;;
esac

# Модель Материнской платы выволить всегда mainboard
#mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi

JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#UINTS}\":\"$UINTS\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\", \"{#MAINBOARD}\":\"$mainboard\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)

#else
if [[ $2 = "info" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $2 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi
Изменения в 3.4
Показать
Добавлено в цикл Соответствие к категории датчиков Юнитов Единиц измерений
CASE - Оператор Выбора в Bash

case $SensorType in
*Clock*)
UINTS="MHz"
;;
*Load*|*Control*)
UINTS="%"
;;
*Temperature*)
UINTS="°C"
;;
*Data*)
UINTS="GB"
;;
*Fan*)
UINTS="RPM"
;;
*Voltage*)
UINTS="V"
;;
esac
Скрипт на подобии на WMIC


Скрипт и шаблон 3.4.1 добавлен порт. Входящая переменная $2 стала портом , а $3 -стал параметр discovery
Пример команд
./OHM3.4.1.sh внешний-ip 10054 discovery
На узле
OHM3.4.1.sh[{HOST.CONN},{$HOST.PORTS},discovery]

Что касаемо макроса {HOST.PORT} - он не работает в правиле автообнаружения, пришлось сделать свой
Hardware-OpenHardwareMonitor-V3.4.1-PORT
Hardware-OpenHardwareMonitor-V3.4.1-PORT
OHM3.4.1.sh
Показать
#!/bin/bash
#2019/12/14 v3.4.1
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=71&p=121#p121

#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info

IFS=$'\n'
JSON="{\"data\":["
SEP=""

if [[ $3 = "discovery" ]]
then
get=`zabbix_get -s $1 -p $2 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor

# Запрос имен и типа железа
gethd=`zabbix_get -s $1 -p $2 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`

# Оставляем нужные нам слобцы по железу (1-HardwareType 2-Identifier 4-Name) (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')

# Пришлось сделать отдельную переменую так как в родитель попадает параметр Процесс ИД когда столбец родитель пустой
# С последним столбцом по железу (делаем между ними 2 пробела) (1-HardwareType 2-Identifier 4-Name 5-Parent 6-ProcessId)
obrhartabl=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4" "$5" "$6}')

# Выбираем родителя датчика который показывает параметры смотрим 2 и 5 столбец (2-Identifier 5-Parent)
tablparent=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$5}')

# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
# (3-InstanceId 6-Name 7-Parent 8-ProcessId 9-SensorType)
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$9}')

#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"

fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Цикл Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец(3-InstanceId)
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)(6-Name)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец(9-SensorType)
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа(7-Parent)
Parent=`echo "${element}"|awk '{print $(NF-2)}'`
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ( (8-ProcessId)
Processid=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования работа со 2 таблицей железо ищем в ней совпадающие сстроки с (таб. sensor столбцы 7-Parent и 8-ProcessId) если совпало выводим 1 столюец табл. железа (1-HardwareType)
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3) табл. железо из столбца 4-Name поскрипту тут он 3столбец
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы железа 2-Identifier и 5-Parent столбец (хотя в 5 попадет 6) в сравнении со столбцом-7-Parent 1-таблицы. Получаем ответ 5-Parent столбца 2 таблицы железа
sopost=`echo "${tablparent}"|grep -E "${Parent}"|awk '{print $2}'`
# Во второй таблице железа (1-HardwareType 2-Identifier 4-Name) ищем соответсвие к имени из параметра выше (5-Parent столбца 2 таблицы железа) если совпало выводим последний столюец железа 4-Name
roditel=$(echo "${obrtablhd}"|grep -E "${sopost}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Тип родителя Во второй таблице железа (1-HardwareType 2-Identifier 4-Name) ищем соответсвие к имени из параметра выше (5-Parent столбца 2 таблицы железа) если совпало выводим первый столбец железа 1-HardwareType
rodtip=`echo "${obrtablhd}"|grep -E "${sopost}"|awk '{print $1}'`

case $SensorType in
*Clock*)
UINTS="MHz"
;;
*Load*|*Control*)
UINTS="%"
;;
*Temperature*)
UINTS="°C"
;;
*Data*)
UINTS="GB"
;;
*Fan*)
UINTS="RPM"
;;
*Voltage*)
UINTS="V"
;;
esac

# Модель Материнской платы выволить всегда mainboard
#mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi

JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#UINTS}\":\"$UINTS\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\", \"{#MAINBOARD}\":\"$mainboard\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)

#else
if [[ $3 = "info" ]]
then
get=`zabbix_get -s $1 -p $2 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $3 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi

Что касаемо триггеров на температуру по умолчанию они деактивированы можно их активировать и пользоваться ими, но их выходит много на каждая ядро потом я делал вручную через параметр или если хотя бы одно превысить триггер сработает и триггер всего один получается. Но нужно создавать его вручную на каждом узле правило обнаружения так не сможет создать триггер.
Так же можно задать не среднее значение avg , а самое новое last и можно указать за какой промежуток времени например температура держится уже больше 10 минут срабатывает триггер или сразу же как превысила отработать триггеру тут все на ваше усмотрение.

Пример триггера
Триггер температур.jpg
Триггер температур.jpg
По графикам можно сделать прототипы графиков но они создадутся на каждый элемент который обнаружен, можно после обнаружения создать вручную графики с нужными элементами, или добавить график на дашборт и сделать его по регулярке например названию элемента и все элементы с таким названием добавятся в график данного узла.
График по регулярке
График по регулярке
Изменения от 20.11.2020г. Open Hardware Monitor из Службы переделываем в Процесс в связи с тем что Антивирусное ПО, nssm - стало считать вирусом и все удалило.

Скачать батники и задачи планировщика
Батники Процесс OpenHardwareMonitor.zip
Батники Процесс OpenHardwareMonitor.zip
(41.15 КБ) 105 скачиваний
Open Hardware Monitor из Службы в Процесс
Показать
Небольшая предыстория
nssm.jpg
nssm.jpg
Внимание! Обнаружена угроза безопасности на станции FS**@DRWEB Станция: FS**@DRWEB (IP-адрес: tcp://192.168.***.*:51391, MAC-адрес: **:**:6d:**:91:**, SID: S-1-5-21-869438569-***********-327****085, описание: отсутствует) Время: 2020-11-20 00:11:13.620 Источник: SpIDer Guard for Windows workstations (система) Объект: C:\zabbix\inst\nssm-2.24\nssm.exe (неизвестно) Тип: программа взлома Угроза: Tool.Nssm.6 Действие: перемещен в карантин

В итоге на 65 серверах все удалило и придется все восстанавливать вручную (причем требуется перезагрузка серверов ибо drweb частично заблокировал)

Ответ службы поддержки
файл из карантина Файл был проанализирован, и подтверждено, что он относится к потенциально опасному ПО - программы взлома, добавление детекта связано с установленным фактом, того, что данная утилита активно используется различным вредоносным ПО. Если использование данной утилиты является обязательным, то необходимо, либо настроить исключения для нее, либо изменить применение действий для всего класса угроз - "потенциально опасное ПО"

Для добавления в исключения необходимо внести путь или исполняемый файл в 5 различных пунктов
1 Антивирусная сеть > Группа > Планировщик заданий > Плановое Сканирование (Было быстрое сканирование , чтоб добавить в исключение нужно переключить в выборочное и указать исключения , получаем полную проверку вместо быстрой)
2 Антивирусная сеть > Группа > Windows > Сканер
3 Антивирусная сеть > Группа > Windows > SpIDer Mail и SpIDer Gate
4 Антивирусная сеть > Группа > Windows > SpIDer Guard
5 Антивирусная сеть > Группа > Windows - Превентивная защита


Решил обновить до последней версии OpenHardwareMonitor.exe 0.9.5
Приложение перенесено с .NET Framework версии 2.0 на .NET Framework версии 4.5 (новое минимальное требование).
Только для 64 битных систем, для x86(32) использовать версию 0.8
Ставим dotnetfx45_full_x86_x64.exe

По умолчанию OHM имеет функционал автостарта при включении и минимизации
Автостарт OHM.jpg
Автостарт OHM.jpg
Можно в целом выставить эти галки и у нас будет работать процесс и мы можем получать данные, и весь переход со службы на процесс.

Но мы не ищем легких путей и у нас есть тут свою нюансы.
Выставляем все галки
Ставим галочки в Options Опции
V Запускать в свернутом виде Start minimized
V Сворачивание в Трей Minimize to tray
V Минимизировать при закрытии Minimize on close
V Запуск при запуске Windows Run on windows startup

И копируем программку на сервера уже с конфигурацией OpenHardwareMonitor.config уже с готовыми галками чтоб на каждом сервере их отдельно не выставлять.
Но есть не задача первые 3 галки у нас сохраняются, а 4 последняя V Запуск при запуске Windows Run on windows startup нет ее нужно ставит руками на каждом сервере.

Смотрим что меняется в файле конфигурации при выставлении галочек
Выключено файле конфига OpenHardwareMonitor.config
<add key="minCloseMenuItem" value="false" />
<add key="minTrayMenuItem" value="false" />
<add key="startMinMenuItem" value="false" />
На включено
<add key="minCloseMenuItem" value="true" />
<add key="minTrayMenuItem" value="true" />
<add key="startMinMenuItem" value="true" />

Параметра на авто запуск нет, смотрим в исходниках какой способ автозапуска используется
в файле StartupManager.cs
Есть вариант автозагрузка из реестра
REGISTRY_RUN = " Программное обеспечение\Microsoft\Windows\CurrentVersion\Run
и
Планировщик заданий в моем случае используется он , видимо если он не доступен тогда в реестр.
Учтем что программка запускается от имени администратора!
Планировщик по умолчанию OHM.jpg
Планировщик по умолчанию OHM.jpg
В целом у нас есть 3 варианта запуска: 1.Планировщик заданий, 2.Автозагрузка через реестр, 3.Автозагрузка через папку автозагрузки
Пример 3 варианта
Показать
:: Автозапуск
::reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v StartupOHM /d C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe /f

:: Планировщик задач создание задачи От имени администратора
:: При входе любого пользователя
::SCHTASKS /Create /SC ONLOGON /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RL Highest /F
:: При загрузке
SCHTASKS /Create /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RU "NT AUTHORITY\LOCALSERVICE" /RL Highest /F

:: Уже готовая задача в XML делаем импорт (от Администратора)
SCHTASKS /Create /tn "\Open Hardware Monitor\Startup" /XML "%~dp0OHM.xml"

:: Папка Автозагрузки в неё нужно скопировать .exe или батник на запуск .exe
::C:\Users\Пользователь\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
::C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

Далее следует учесть следующие нюансы:
Через планировщик заданий запуск стандарт
Приоритет процесса ниже среднего (при нехватке ресурсов сервера может выкинуть процесс завершить)
Запуск при входе пользователя На серверах это не подходит (нужен запуск при включении вне зависимости от пользователя)
Есть иконка в трее, лишний раз чтоб никого она не смущала скрыть.

Еще возникли некоторые сложности
При работе процесса OpenHardwareMonitor.exe от Локального пользователя В cmd Значение температуры выдает везде 0 , так же некоторых элементов вовсе не видит, которые видны от учетки Администратора.
команда WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor

Причем когда было в виде службы, процесс работал так же от имени локальной системы, но данные отдавал корректно и сам прцесс было не завершить!

Т.е. сделать команду на планировщик от пользователя NT AUTHORITY\LOCALSERVICE для того что бы не заворачивается не вводить пароль от учеток не выйдет.
Делаем запуск при загрузке в планировщике от Администратора или Другова любого пользователя где данные в cmd у нас все хорошо отдаются, так же делаем приоритет процесса высокий. (можно еще триггеров добавить на каждые 3 часа например на запуск если остановится)

Что делать если процесс OpenHardwareMonitor все же завершился не запускать же его вручную
Делаем проверку процесса OpenHardwareMonitor при срабатывании триггера выполняем действие в zabbix на старт процесса
Проверка что процесс запущен
zabbix_get -s 192.168.XXX.XXX -k 'proc.num[OpenHardwareMonitor.exe]'

Раньше было Службой так
Было Cлужба "OpenHardwareMonitor" (OpenHardwareMonitor) ключ service.info[OpenHardwareMonitor,state]
zabbix_get -s 192.168.XXX.XXX -k 'service.info[OpenHardwareMonitor,state]'

Можно в действии просто указать стартовать процесс с высоким приоритетом
start "" /high " C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe"
Но zabbix agent работает от локального пользователя и процесс запустится от имени локального пользователя , а нам этого не надо так как значения температуры будут 0 (да можно сделать заббикс службу от другова пользователя но нам надо именно от локального)
Вариант не подходит

Запускаем процесс планировщик при помощи заббикс агента
SCHTASKS /Run /I /TN "\Open Hardware Monitor\Startup"
Если нужно можно и перезапустить вначале остановив
SCHTASKS /End /TN "\Open Hardware Monitor\Startup"

Вроде бы все ничего , в планировщике указанно не запускать новый экземпляр если уже запущен, но это не сработало и в диспетчере было спустя неделю 10 процессов Open Hardware Monitor это не годилось. Нужен 1 работающий процесс!

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

Что в Итоге получилось
Все же нужно поставить автоматом)

Программа и батники должны быть уже скопированы в C:\zabbix\OpenHardwareMonitor
Запуск вручную батника

Батник на установку install-OHM.bat
1. Тихая установка dotnetfx45
2. Прописываем Задания планировщик от имени Администратора с паролем или выбираем вариант 1 из 3х
3. Если планировщик поддерживает импорт, более настроенные загружаем из XML
2 задания Startup и restart-ohm.bat
4. Запускаем Задания
5. Проверка что процесс запустился, если нет запускаем
install-OHM.bat
Показать
@Echo Off
chcp 866 >NUL
TITLE Автозагрузка OHM в качестве процесса

::Получаем просто подсеть из начала совпадения строки более правильно чем dns
for /f "tokens=2 delims=:(" %%d in ('ipconfig /all^|FIND /I "IP"^|FINDSTR /c:"192.168." /c:"172.16."') do (
:: разбиваем на октеты
for /f "tokens=1-4 delims=. " %%k in ("%%d") do set IP=%%m
)
:: Оставляем только 2х значный номер района
set podseti=%IP:~1,11%

:: Учетная запись Логин пароль
set loginp=Администратор
set password=Паро%podseti%ль

:: Установка NET Framework 4.5 если его нет
::start /wait "%~dp0"dotnetfx45_full_x86_x64.exe /quiet /norestart
"%~dp0"dotnetfx45_full_x86_x64.exe /q /norestart

:: Автозагрузка OHM

:: Автозапуск через реестр
::reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v StartupOHM /d C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe /f

:: Планировщик задач создание задачи От имени администратора
:: При входе любого пользователя
::SCHTASKS /Create /SC ONLOGON /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RL Highest /F

:opros
:: Вопрос От какой учетной записи внести задание в планировщик для OHM
set /P otvet=Y-Указать Учетную запись для запуска OpenHardwareMonitor Q-Учетная запись из скрипта N-от группы Система или локальный пользователь [Y,Q,N]?:
if /i "%otvet%"=="y" (goto :yes) else (if /i "%otvet%"=="n" (goto :no) else if /i "%otvet%"=="q" (goto :autovod) else (goto :opros))
:: Если нет ответа 3 минуты автоматом значение N работает от Windows 7
::CHOICE /C YQN /N /T 180 /D N /M "Y-Указать Учетную запись для запуска OpenHardwareMonitor Q-Учетная запись из скрипта N-от группы Система или локальный пользователь [Y,Q,N]?:"
::if /i "%ERRORLEVEL%"=="1" (goto :yes) else (if /i "%ERRORLEVEL%"=="2" (goto :autovod) else if /i "%ERRORLEVEL%"=="3" (goto :no) else if /i "%ERRORLEVEL%"=="255" (goto :opros))
:no
:: От Группа Система или Локального пользователя
set login=S-1-5-18
::set login=NT AUTHORITY\LOCALSERVICE
set "pass="
:: При загрузке Windows
SCHTASKS /Create /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RU "NT AUTHORITY\LOCALSERVICE" /RL Highest /F
SCHTASKS /Create /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RU "S-1-5-18" /RL Highest /F
:: Уже готовая задача в XML делаем импорт
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\Open Hardware Monitor\Startup" /XML "%~dp0OHM.xml" /F
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\Open Hardware Monitor\restart-ohm.bat" /XML "%~dp0restart-ohm.bat.xml" /F
goto :dalee

:autovod
:: При загрузке Windows
SCHTASKS /Create /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RU "NT AUTHORITY\LOCALSERVICE" /RL Highest /F
SCHTASKS /Create /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RU "S-1-5-18" /RL Highest /F
SCHTASKS /Create /RU "%loginp%" /RP "%password%" /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RL Highest /F
:: Уже готовая задача в XML делаем импорт (от Администратора)
SCHTASKS /Create /RU "%loginp%" /RP "%password%" /tn "\Open Hardware Monitor\Startup" /XML "%~dp0OHM.xml" /F
SCHTASKS /Create /RU "%loginp%" /RP "%password%" /tn "\Open Hardware Monitor\restart-ohm.bat" /XML "%~dp0restart-ohm.bat.xml" /F
goto :dalee

:yes
:: Визуальный вывод и получение ввода данных
chcp 866 >NUL
echo Логин/Login
set /P login=
set login=%login%
echo.
echo Пароль/Password
set /P pass=
set pass=%pass%
echo.

:: При загрузке Windows
SCHTASKS /Create /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RU "NT AUTHORITY\LOCALSERVICE" /RL Highest /F
SCHTASKS /Create /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RU "S-1-5-18" /RL Highest /F
SCHTASKS /Create /RU "%login%" /RP "%pass%" /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RL Highest /F
:: Уже готовая задача в XML делаем импорт
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\Open Hardware Monitor\Startup" /XML "%~dp0OHM.xml" /F
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\Open Hardware Monitor\restart-ohm.bat" /XML "%~dp0restart-ohm.bat.xml" /F
goto :dalee

:dalee
:: Выполнить на локальном компьютере задание "Startup" немедленно, игнорируя любые ограничения
SCHTASKS /Run /I /TN "\Open Hardware Monitor\Startup"
SCHTASKS /Run /I /TN "\Open Hardware Monitor\restart-ohm.bat"

:: Папка Автозагрузки в неё нужно скопировать .exe или батник на запуск .exe
::C:\Users\Пользователь\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
::C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

:: Проверка что процесс запустился, если нет запускаем
TaskList /FI "ImageName EQ OpenHardwareMonitor.exe" 2>nul|Find /I "OpenHardwareMonitor.exe">nul||(
Start "" /high "%~dp0OpenHardwareMonitor.exe"
)
Задание в планировщик OHM-adm.xml
OHM-adm.xml
Показать
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>Эта задача запускает Open Hardware Monitor при запуске Windows.</Description>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
</BootTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>1</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>7</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>"C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe"</Command>
<WorkingDirectory>C:\zabbix\OpenHardwareMonitor</WorkingDirectory>
</Exec>
</Actions>
</Task>
Задание в планировщик restart-ohm.bat.xml
restart-ohm.bat.xml
Показать
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>Проверка запущен ли процесс Open Hardware Monitor, если нет запускаем, если несколько завершаем лишние оставляем 1, если 1 ничего не делаем.</Description>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
</BootTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T00:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T06:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T12:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T18:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>true</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>1</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>5</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\zabbix\OpenHardwareMonitor\restart-ohm.bat</Command>
</Exec>
</Actions>
</Task>
Скрипт проверки запуска и убирания лишних процессов restart-ohm.bat
1. Получаем количество процессов OpenHardwareMonitor.exe
2. В зависимости от результата выполняем то или иное действие
Если есть дубли больше 1 процесса то Завершить дубли процесса, оставим 1 процесс
Если процесс 1 ничего не делать
Если нет процесса Запустить
restart-ohm.bat
Показать
@Echo Off

:: Завершить дубли процессов если их несколько и запускаем процесс если его нет совсем
:: Получаем количество процессов
for /f %%b in ('tasklist^|find /c /i "OpenHardwareMonitor.exe"') do (
if /i %%b GTR 1 (goto :KILL) else (if /i %%b==0 (goto :START) else (goto :end)))

:KILL
:: Завершить дубли процеса, пропускаем 1 процесс
for /f "skip=1 tokens=2 delims= " %%a in ('tasklist^|find /I "OpenHardwareMonitor.exe"') do (
TASKKILL /PID %%a /T /F )
goto :end

:START
:: Планировщик заданий Остановка процесса
SCHTASKS /End /TN "\Open Hardware Monitor\Startup"
:: Для старой версии
SCHTASKS /End /TN "Open Hardware Monitor"
:: Убить процесс если он не завершился
TASKKILL /IM OpenHardwareMonitor.exe /T /F
:: Завершить процесс по PID
for /f "tokens=2 delims= " %%a in ('tasklist^|find /I "OpenHardwareMonitor.exe"') do (
TASKKILL /PID %%a /T /F )

:: Запуск Процесса
:: Выполнить на локальном компьютере задание "Startup" немедленно, игнорируя любые ограничения
SCHTASKS /Run /I /TN "\Open Hardware Monitor\Startup"
:: Для старой версии
SCHTASKS /Run /TN "Open Hardware Monitor"

:: Проверка что процесс запустился, если нет запускаем
TaskList /FI "ImageName EQ OpenHardwareMonitor.exe" 2>nul|Find /I "OpenHardwareMonitor.exe">nul||(
Start "" /high "%~dp0OpenHardwareMonitor.exe"
)
Действие в Заббикс сервере на срабатывание триггера что нет процесса OpenHardwareMonitor

Запускается много процессов
SCHTASKS /End /TN "\Open Hardware Monitor\Startup"
SCHTASKS /End /TN "Open Hardware Monitor"
SCHTASKS /Run /I /TN "\Open Hardware Monitor\Startup"
SCHTASKS /Run /TN "Open Hardware Monitor"

Переделываем так же планировщике но через скрипт
1 Попытка стартуем
SCHTASKS /Run /I /TN "\Open Hardware Monitor\restart-ohm.bat"
SCHTASKS /Run /TN "restart-ohm.bat"
2 Завершить процесс
SCHTASKS /End /TN "\Open Hardware Monitor\Startup"
SCHTASKS /End /TN "Open Hardware Monitor"
TASKKILL /IM OpenHardwareMonitor.exe /T /F
Еще 2 попытки старта

Почему тут 2 команды, вторая для старых версий серверов 2003
планировщик 2003.jpg
планировщик 2003.jpg
Проверка выполнения задания Пример
zabbix_get -s 192.168.xxx.xxx -p 10050 -k system.run["SCHTASKS /Run /I /TN \"\Open Hardware Monitor\Startup\""]

Далее в Заббиксе в триггерах дополнительно нужно задать проверки
Превышение температуры она у нас была .avg(#3)}>60 or
1 То что температура не 0 , если 0 ошибка .avg(#3)}=0 or
2 Если нет данных так же ошибка .nodata(1h)}=1
3 Зависимость от процесса Open Hardware Monitor

Пример
Триггер температуры.jpg
Триггер температуры.jpg
Сам триггер Open Hardware Monitor зависит от пинга агента узла
{FS:proc.num[OpenHardwareMonitor.exe].last()}=0 or
{FS:proc.num[OpenHardwareMonitor.exe].nodata(50m)}=1
или можно сделать чтоб проверял еще не больше одного заменить =1 на <>1
{FS:proc.num[OpenHardwareMonitor.exe].last()}<>1 or

Да можно создать отдельный триггер на элемент проверки 0 температуры и нет данных , но я сделал все в одном.

Проверка работы процесса OpenHardwareMonitor
для сбора температуры и других датчиков.
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})

0 Не запущен или больше 1 процесса запущено
Либо нет данных более 50 минут
Триггер процесса.jpg
Триггер процесса.jpg
Триггер процесса2.jpg
Триггер процесса2.jpg
Первый вариант От имени локальная система (не работает корректно)
install-OHM.bat
install-OHM.bat
Показать
@Echo Off
chcp 1251 >NUL
TITLE Автозагрука OHM в качестве процесса
:: Установка NET Framework 4.5 если его нет
::start /wait "%~dp0"dotnetfx45_full_x86_x64.exe /quiet /norestart
"%~dp0"dotnetfx45_full_x86_x64.exe /q /norestart

:: Автозагрузка OHM

:: Автозапуск через реестр
::reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v StartupOHM /d C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe /f

:: Планировщик задач создание задачи От имени администратора
:: При входе любого пользователя
::SCHTASKS /Create /SC ONLOGON /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RL Highest /F

:: При загрузке Windows
SCHTASKS /Create /SC ONSTART /TN "\Open Hardware Monitor\Startup" /TR "'C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe'" /RU "NT AUTHORITY\LOCALSERVICE" /RL Highest /F

:: Уже готовая задача в XML делаем импорт (от Администратора)
SCHTASKS /Create /tn "\Open Hardware Monitor\Startup" /XML "%~dp0OHM.xml" /F
SCHTASKS /Create /tn "\Open Hardware Monitor\restart-ohm.bat" /XML "%~dp0restart-ohm.bat.xml" /F

:: Выполнить на локальном компьютере задание "Startup" немедленно, игнорируя любые ограничения
SCHTASKS /Run /I /TN "\Open Hardware Monitor\Startup"
SCHTASKS /Run /I /TN "\Open Hardware Monitor\restart-ohm.bat"

:: Папка Автозагрузки в неё нужно скоприровать .exe или батник на запуск .exe
::C:\Users\Пользователь\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
::C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

:: Проверка что процесс запустился, если нет запускаем
::TaskList /FI "ImageName EQ OpenHardwareMonitor.exe" 2>nul|Find /I "OpenHardwareMonitor.exe">nul||(
::Start "" /high "%~dp0OpenHardwareMonitor.exe"
::)
Задача OHM.xml
OHM.xml
Показать
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>Эта задача запускает Open Hardware Monitor при запуске Windows.</Description>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
</BootTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-19</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>1</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>7</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>"C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe"</Command>
<WorkingDirectory>C:\zabbix\OpenHardwareMonitor</WorkingDirectory>
</Exec>
</Actions>
</Task>
Задача restart-ohm.bat.xml
restart-ohm.bat.xml
Показать
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>Проверка запущен ли процесс Open Hardware Monitor, если нет запускаем, если несколько завершаем лишние оставляем 1, если 1 ничего не делаем.</Description>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
</BootTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T00:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T06:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T12:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T18:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-19</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>true</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>1</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>5</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\zabbix\OpenHardwareMonitor\restart-ohm.bat</Command>
</Exec>
</Actions>
</Task>
Другая различная инфа при создании скриптов и планировщика
Показать
После тестирования пользователей в планировщике желательно очистить хост-узел от элементов и обнаружить их заново, уже на конкретно рабочем пользователе в планировщике заданий.

открываем файл задания, находим раздел Priority и указываем желаемый приоритет. Для запланированных заданий по умолчанию устанавливается значение 7, что означает ниже среднего. Обычно для повышения приоритета достаточно указать значение 5 (выше среднего).
Примечание. Приоритет запланированного задания может принимать значение от 0 до 10, чем ниже значение, тем выше приоритет. Более подробно о приоритетах можно узнать здесь.

0 КЛАСС ПРИОРИТЕТА В РЕАЛЬНОМ ВРЕМЕНИ ПРИОРИТЕТ ПОТОКА КРИТИЧЕСКИЙ ПО ВРЕМЕНИ
1 КЛАСС ВЫСОКОГО ПРИОРИТЕТА ПРИОРИТЕТ ПОТОКА САМЫЙ ВЫСОКИЙ
2 ВЫШЕ НОРМАЛЬНОГО КЛАССА ПРИОРИТЕТА ПРИОРИТЕТ ПОТОКА ВЫШЕ НОРМЫ
3 ВЫШЕ НОРМАЛЬНОГО КЛАССА ПРИОРИТЕТА ПРИОРИТЕТ ПОТОКА ВЫШЕ НОРМЫ
4 НОРМАЛЬНЫЙ КЛАСС ПРИОРИТЕТА ПРИОРИТЕТ ПОТОКА НОРМАЛЬНЫЙ
5 НОРМАЛЬНЫЙ КЛАСС ПРИОРИТЕТА ПРИОРИТЕТ ПОТОКА НОРМАЛЬНЫЙ
6 НОРМАЛЬНЫЙ КЛАСС ПРИОРИТЕТА ПРИОРИТЕТ ПОТОКА НОРМАЛЬНЫЙ
7 ПРИОРИТЕТ НИЖЕ СРЕДНЕГО КЛАССА ПРИОРИТЕТА ПОТОКА НИЖЕ НОРМЫ
8 ПРИОРИТЕТ НИЖЕ СРЕДНЕГО КЛАССА ПРИОРИТЕТА ПОТОКА НИЖЕ НОРМЫ
9 КЛАСС ПРИОРИТЕТА ХОЛОСТОГО ХОДА ПРИОРИТЕТ ПОТОКА САМЫЙ НИЗКИЙ
10 КЛАСС ПРИОРИТЕТА ХОЛОСТОГО ХОДА ПРИОРИТЕТ ПОТОКА ХОЛОСТОЙ ХОД


с помощью PowerShell
$task = Get-ScheduledTask -TaskName "MyTask"
$task.Settings.Priority

А изменить так:
$settings = New-ScheduledTaskSettingSet -Priority 5
Set-ScheduledTask -TaskName "MyTask" -Settings $settings

Групповые политики
gpedit.msc ищем планировщик заданий и смотрим uid задачи и ищем в папке данный xml

C:\Windows\System32\Tasks
C:\Windows\Tasks
C:\Windows\Tasks\DoWork.job
Затем они ссылаются на реестр в
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\Taskcache\Tasks
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\Taskcache\Tree
количество слов: 4189
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Артём Мамзиков »

Продолжение поста выше О процессе Open Hardware Monitor
Показать
В планировщике заданий
Можно поэкспериментировать с пользователями и группами где есть полноценные данные, а где нет , где требуется пароль , а где нет.
Например данные идут от Группы Система пароль не требуется sid группы S-1-5-18

::Все SID пользователей команда для cmd
wmic useraccount get name,sid

::в реестре HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
Таблица групп и пользователей
Если возникают ошибки в работе WMI OpenHardwareMonitor что то вроде
C:\WINDOWS\system32>WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor
Отсутствуют экземпляры.
C:\Windows\system32>WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor
No Instance(s) Available.
Ошибки OpenHardwareMonitor
Ошибки OpenHardwareMonitor
Возможно такой сбой может быть вызван некорректными командами в powershell причем все остальное может работать через wmi нормально.
При первом запуске создается компилируется и регистрируюца библиотеки C:\Windows\System32\wbem\Framework\root\OpenHardwareMonitor там лежат 2 файла Managed Object Format - MOF-файле возможно ошибка в них.
Чистка реестра полностью от OpenHardwareMonitor и nssm.exe а так же их поиск на ПК и дальней шее удаление потом установка с 0 не помогла, так же подгрузка недостающий кустов реестра связанных с OpenHardwareMonitor с рабочего ПК где все работает норм так же не помогла.

Дело было в wmi что то сбилось в нем на эту утилиту стал искать как заново создать параметры wmi

Восстановление работы Windows Management Instrumentation (WMI) после фатального сбоя

Устранение неполадок в WMI

Помогло
Проверяем целостность (На Windows XP и ниже не работает):

winmgmt /verifyrepository

В случае ответа отличного от “База данных WMI согласована”, можно выполнить "мягкое восстановление" командой:

winmgmt /salvagerepository

с последующим перезапуском службы:

net stop Winmgmt
net start Winmgmt

Если мягкое восстановление не помогло, пробуем вернуть хранилище в начальное состояние (последствия: все дополнительные классы WMI, когда-либо зарегистрированные в вашей системе, скорее всего, придётся регистрировать заново):

winmgmt /resetrepository

с последующим рестартом системы. Отмечу, что вторая машина заработала после этого этапа. Последствия были не сильно удручающими, но серьёзными: пришлось переинсталлировать Visual Studio и Delphi Starter, MS Office отказался работать и его пришлось деинсталлировать вручную, удаляя папки, файлы и записи из реестра, с последующей повторной установкой. Также слетели все наши собственные классы WMI.

Заново зарегистрировать модуль OpenHardwareMonitor после чего все заработало, но если у вас так же есть какие то сторонние модуля их так же нужно будет запустить для регистрации


Так же возможно на новых версиях Заббикс Сервера возникнуть что перестанет поддерживаться data изменится JONS
формат JSON изменения
Показать
Низкоуровневое обнаружение
Обратите внимание, что начиная с Zabbix 4.2, формат JSON, возвращаемый правилами низкоуровневого обнаружения изменился. Более не ожидается, что JSON будет содержать объект "data". Низкоуровневое обнаружение теперь принимает обычный JSON, который содержит массив, для поддержки новых функций, таких как предобработка значений элементов данных и пользовательских путей к значениям макросов низкоуровневого обнаружения в JSON документе.

Встроенные ключи обнаружения обновлены и теперь возвращают массивы LLD строк корневым JSON документом. Zabbix автоматически извлечёт макрос и значение, если поле массива использует {#МАКРОС} ключом. Любые новые встроенные проверки обнаружения будут использовать новый синтаксис без "data" элементов. При обработке значения низкоуровневого обнаружения сначала определяется корень (массив $. или $.data).

Хотя "data" элемент удален со всех встроенных элементов данных, которые относятся к обнаружению, для обратной совместимости Zabbix будет ещё принимать JSON представление с "data" элементов, хотя его использование не рекомендуется. Если JSON содержит объект только с одним "data" элементом массива, тогда этот массив будет автоматически извлечён из содержимого элемента с использованием JSONPath $.data. Теперь низкоуровневое обнаружение принимает пользовательские LLD макросы с пользовательским путём, который задается в JSONPath синтаксисе.
количество слов: 127
Sergh
Гость
Сообщения: 10
Стаж: 3 года 9 месяцев

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Sergh »

Уважаемые формучане прошу помощи, пытаюсь реализовать данную схему мониторинга и столкнулся с ошибкой.
На Winows скрипт "wmic.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor" выполняется без проблем и данные выводятся. Проблема при удаленном запросе таблицы хоста "zabbix_get -s 192.168.55.62 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor"]"с сервера "Zabbix". В ответ получаю "ZBX_NOTSUPPORTED: Unsupported item key." Что я делаю не так, может нужно что-то добавить в конфиг zabbix agent windows?
количество слов: 34
Sergh
Гость
Сообщения: 10
Стаж: 3 года 9 месяцев

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Sergh »

разобрался, данные с zabbix сервера получаю. Проблема в 5 версии Zabbix, в 4 версии Zabbix таблицу получаю без проблем.
Помогите разобраться с другой проблемой.
При выполнении OHM скрипта любой версии (./OHM3.4.sh 192.168.55.62 discovery) с zabbix сервера получаю вот такой вывод:
{"data":[
]}
Я правильно понимаю что скрипт нужно редактировать?
количество слов: 16
Sergh
Гость
Сообщения: 10
Стаж: 3 года 9 месяцев

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Sergh »

Разобрался, данные стали поступать. Проблема теперь в другом. У меня 2 сервера, на оба применил данный шаблон. Сервер Zabbix находится за NAT. Показания с датчиков приходят с 2 серверов, но название комплектующих отображаются не корректно, т.е. название комплектующих 1 сервера дублируются на 2 сервер.
количество слов: 6
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Артём Мамзиков »

Sergh, Получается что данные идут с одного IP от нат ? и он путается через внешнюю проверку когда происходит поиск?
Это на версии скрипта 3.4 ?
количество слов: 4
Sergh
Гость
Сообщения: 10
Стаж: 3 года 9 месяцев

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Sergh »

Артём Мамзиков писал(а): Чт июн 11, 2020 17:13 Sergh, Получается что данные идут с одного IP от нат ? и он путается через внешнюю проверку когда происходит поиск?
Это на версии скрипта 3.4 ?
Да. Агенты работают на разных портах 10050 и 10052. Помогите пожалуйста разобраться.
количество слов: 10
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Артём Мамзиков »

Sergh, Дело не совсем в протах, дело в обнаружении элементов, а элементы обнаруживаются не заббикс агентом, а внешней проверкой (скриптом)
Смотри что тебе отдают команды
Запрос всей таблицы
zabbix_get -s 172.16.121.7 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor"]
Запрос железа
zabbix_get -s 172.16.121.7 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Hardware"]

есть ли в них путанница так как они создают элементы а дальше уже заббикс агент запрашивает значения

Вариант с портом
Запрос всей таблицы
zabbix_get -s 172.16.121.7 -p 10050 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor"]
Запрос железа
zabbix_get -s 172.16.121.7 -p 10050 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Hardware"]


Я думаю у тебя вся проблема в том что я не применял в скрипте порт т.е. он стандартный
get=`zabbix_get -s $1 -k system.run
а тебе нужен такого формата
zabbix_get -s 127.0.0.1 -p 10050 -k system.run
т.е. с двумя переменными входными $1 - IP и $2 - порт и сдвигаем if [[ $3 = "discovery" ]] уже будет поиск т е сместится
Ключ поиска уже будет таким в шаблоне
OHM3.4.sh[{HOST.CONN},{HOST.PORT},discovery]
Выглядеть это будет примерно так пример
OHM3.4.sh 127.0.0.1 10050 discovery
Можно еще по DNS сделать вместо IP если есть на узле
{HOST.DNS} или универсальный в зависимости что на умолчании {HOST.CONN}
Поддерживаемые макросы
количество слов: 122
Sergh
Гость
Сообщения: 10
Стаж: 3 года 9 месяцев

Скрипт + Шаблон для Windows LLD Open Hardware Monitor

Сообщение Sergh »

Спасибо что отвечаете и помогаете разобраться.
В скрипт добавил обнаружение порта. Это все? я заменил везде $2 на $3 и получилось так:
if [[ $3 = "discovery" ]]

then

get=`zabbix_get -s $1 -p $2 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`

gethd=`zabbix_get -s $1 -p $2 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`

#else
if [[ $3 = "info" ]]

then

get=`zabbix_get -s $1 -p $2 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`

Это все что нужно было отредактировать в скрипте?

Теперь при выполнении OHM3.4.sh 127.0.0.1 10050 discovery и OHM3.4.sh 127.0.0.1 10052 discovery,
Отображается таблица с разных серверов.
Если выполнять просто OHM3.4.sh 127.0.0.1 discovery, то данных не будет.
Вопрос по шаблону.
Я правильно понимаю что в шаблоне нужно поправить лишь ключ в "Правило обнаружения" с OHM3.4.sh[{HOST.CONN},discovery] на
OHM3.4.sh[{HOST.CONN},{HOST.PORT},discovery] ?


На Zabbix сервере в последних данных сейчас вот что:
на 2 серверах:
https://prnt.sc/sy59m4
т.е. данные не поступают(
количество слов: 108
Ответить Вложения 36 Пред. темаСлед. тема

Вернуться в «Аппаратное обеспечение Общее для всех систем»