Скрипт + Шаблон для Linux LLD LM-Sensors

Мониторинг Железа
Датчики температур
Кулера
Диски
Напряжение
и т.д.
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 336
Зарегистрирован: Вс фев 17, 2019 17:47
Репутация: 4
Откуда: Вологодская область
Контактная информация:

Скрипт + Шаблон для Linux LLD LM-Sensors

Сообщение Артём Мамзиков » Вт авг 13, 2019 09:02 #1

Скрипт + Шаблон для Linux LLD LM-Sensors
Сделал 2 варианта шаблонов через команду sensors и через команду sensors -u

Тут можно почитать О программе LM-Sensors Дополнительные опции, как работает, скачать. Загляните посмотрите!
Zabbix-lm-sensors-lld.zip
Скачать Архив со скриптами и шаблонами
(244.36 КБ) 23 скачивания



Установка
Устанавливаем на удаленный Хост программу lm-sensors
Скачиваем скрипт ложим его на заббикс сервер в моем случае путь такой
/usr/local/share/zabbix/externalscripts
Делаем импорт шаблона
Добавляем к узлу шаблон

Установка LM-Sensor Debian
Установка
apt-get install lm-sensors или скачать пакеты и установить из пакетов dpkg -i libsensors4_3.4.0-4_amd64.deb lm-sensors_3.4.0-4_amd64.deb
определяем тип железа любым из 3х способов ниже
sensors-detect --auto Автоматом рекомендуемое
yes | sensors-detect Все YES
sensors-detect Вручную Соглашаемся везде YES
Запускаем
/etc/init.d/kmod start или /etc/init.d/module-init-tools start
Проверяем командой
sensors

Еще на удаленном хосте (узле) должен быть установлен заббикс агент (zabbix_get) для выполнения команды

Так же на сервере должен быть установлен zabbix_get так как запрос идет через него zabbix_get -s $1 -k system.run["sensors -u"], он входит в набор заббикс агента
Утилиты командной строки zabbix_get и zabbix_sender компилируются, если использована опция --enable-agent.

Или же надо zabbix_get заменять на обычную команду SSH команду (что то будет вроде ssh Логин $ @IP $1 хоста system.run["sensors -u"]), если не использовать агента и zabbix_get. Но придется делать авторизацию по логин паролю при каждом запросе данных будет происходить авторизация по ssh что по мне совсем не есть хорошо!

К установке рекомендую скрипт версии 3.0 и желательно элементы через агента! Скрипт обнаружит элементы создаст, далее агент минуя все скрипты напрямую по элементу запросит данные с Хоста (узла)
Скрипт версии 2.0 опрашивает только температуру. Работает в обе стороны через скрипт скрипт обрабатывает весь листинг комады поиск обрезка и тп т.е. вся нагрузка обработки узлов будет на сервере.
Скрипт 2.6 как и 2.0 только добавлено отдельно обнаружение и обработка других параметров Напряжения и кулерров
Пример Как перекопировать установочные пакеты с одного linux на другой если нет инета
Показать
Пример для тех у кого нет доступа на загрузку только внутреня сеть
ssh Пользователь@IP IP удаленного Linux
например ssh root@192.168.548.96
Подтверждаем yes
Вводим пароль
Все мы на удаленном Linux
дальше заходим в mc
Выбираем правая панель там FTP или Shell
вводим логин и IP адрес 1 устройства от куда мы подключились например
Right - Shell link... -
sh://root@192.168.548.21/root Воодим yes логи пароль
или
sftp://root@192.168.548.21/root
тут у нас уже лежат 2 скаченных файла в папке lm-sensors
копируем папку по f5 выходим из mc по f10
переходим в папку командой cd lm-sensors
и запускаем установку dpkg -i libsensors4_3.4.0-4_amd64.deb lm-sensors_3.4.0-4_amd64.deb
далее определяете железо как описано выше
доп инфо о LM-sensors
Показать
lm-sensors - программный инструмент, извлекающий данные из аппаратных датчиков на материнской плате для мониторинга температуры, напряжения, влажности и т д;
hddtemp - инструмент для измерения температуры жестких дисков;
psensor - графическая утилита для мониторинга температуры, которая позволяет посмотреть температуру linux, для процессора, видеокарты, жестких дисков и других компонентов, которые поддерживают эту функцию.

Иногда, когда не все датчики доступны, то может помочь параметр:
acpi_enforce_resources=lax
Он прописывается, как дополнительный в загрузчик Grub. Делается это в файле etc/default/grub в таком виде:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_enforce_resources=lax"
В примерах буду использоваться следующие значение программы sensors и sensors -u
Показать
root@ZABBIXSERVER:~# sensors
acpitz-virtual-0
Adapter: Virtual device
temp1: +29.8°C (crit = +100.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0: +25.0°C (high = +74.0°C, crit = +94.0°C)
Core 0: +23.0°C (high = +74.0°C, crit = +94.0°C)
Core 1: +23.0°C (high = +74.0°C, crit = +94.0°C)
Core 2: +25.0°C (high = +74.0°C, crit = +94.0°C)
Core 3: +22.0°C (high = +74.0°C, crit = +94.0°C)

root@ZABBIXSERVER:~# sensors -u
acpitz-virtual-0
Adapter: Virtual device
temp1:
temp1_input: 29.800
temp1_crit: 100.000

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:
temp1_input: 21.000
temp1_max: 74.000
temp1_crit: 94.000
temp1_crit_alarm: 0.000
Core 0:
temp2_input: 20.000
temp2_max: 74.000
temp2_crit: 94.000
temp2_crit_alarm: 0.000
Core 1:
temp3_input: 20.000
temp3_max: 74.000
temp3_crit: 94.000
temp3_crit_alarm: 0.000
Core 2:
temp4_input: 22.000
temp4_max: 74.000
temp4_crit: 94.000
temp4_crit_alarm: 0.000
Core 3:
temp5_input: 22.000
temp5_max: 74.000
temp5_crit: 94.000
temp5_crit_alarm: 0.000
lm-sensors.jpg
lm-sensors
А так же вариант с напряжениям и кулерами плюс строка с отдельными скобками
k8temp-pci-00c3
Adapter: PCI adapter
Core0 Temp: +27.0В°C
Core0 Temp: +30.0В°C
Core1 Temp: +29.0В°C
Core1 Temp: +31.0В°C

nouveau-pci-0200
Adapter: PCI adapter
GPU core: +1.20 V (min = +0.90 V, max = +1.20 V)
temp1: +45.0В°C (high = +95.0В°C, hyst = +3.0В°C)
(crit = +105.0В°C, hyst = +5.0В°C)
(emerg = +135.0В°C, hyst = +5.0В°C)

it8712-isa-0290
Adapter: ISA adapter
in0: +1.14 V (min = +0.00 V, max = +4.08 V)
in1: +4.08 V (min = +0.00 V, max = +4.08 V) ALARM
in2: +3.31 V (min = +0.00 V, max = +4.08 V)
+5V: +4.08 V (min = +0.00 V, max = +4.08 V) ALARM
in4: +3.17 V (min = +0.00 V, max = +4.08 V)
in5: +1.55 V (min = +0.00 V, max = +4.08 V)
in6: +4.08 V (min = +0.00 V, max = +4.08 V) ALARM
5VSB: +4.08 V (min = +0.00 V, max = +4.08 V) ALARM
Vbat: +3.09 V
fan1: 3292 RPM (min = 0 RPM)
fan2: 2896 RPM (min = 0 RPM)
fan3: 0 RPM (min = 0 RPM)
temp1: +33.0В°C (low = -1.0В°C, high = +127.0В°C) sensor = thermistor
temp2: +32.0В°C (low = -1.0В°C, high = +127.0В°C) sensor = thermistor
temp3: -128.0В°C (low = -1.0В°C, high = +127.0В°C) sensor = disabled
intrusion0: OK

Хотим получить следующий вывод из этих данных

Вывод V1 и V2 скрипта не отличается, если нет строк начинающихся на скобки (
Пример:
temp1: +45.0В°C (high = +95.0В°C, hyst = +3.0В°C)
(crit = +105.0В°C, hyst = +5.0В°C)
(emerg = +135.0В°C, hyst = +5.0В°C)

root@ZABBIXSERVER:~# ./1.sh IP discovery
{"data":[
{"{#NAMETEMP}":"1temp1"},
{"{#NAMETEMP}":"2Physicalid0"},
{"{#NAMETEMP}":"3Core0"},
{"{#NAMETEMP}":"4Core1"},
{"{#NAMETEMP}":"5Core2"},
{"{#NAMETEMP}":"6Core3"}
]}
root@ZABBIXSERVER:~#
Вывод sensors V2.0.jpg
Вывод sensors V2.0

Вывод скрипта V2.6 раздельный поиск по группам
root@ZABBIXSERVER:~# ./2.6.sh IP discovery.temp
{"data":[
{"{#NAMETEMP}":"1temp1"},
{"{#NAMETEMP}":"2Physicalid0"},
{"{#NAMETEMP}":"3Core0"},
{"{#NAMETEMP}":"4Core1"},
{"{#NAMETEMP}":"5Core2"},
{"{#NAMETEMP}":"6Core3"}
]}
root@ZABBIXSERVER:~# ./2.6.sh IP discovery.fan
root@ZABBIXSERVER:~# ./2.6.sh IP discovery.volt
{"data":[
{"{#NAMEVOLT}":"1Adapter"}
]}
root@ZABBIXSERVER:~#
Вывод sensors V2.6.jpg
Вывод sensors V2.6
Обратный запрос значения происходит командами через скрипт от V1.0 - V2.6
root@ZABBIXSERVER:~# ./2.6.sh IP temperature {#NAMETEMP}
root@ZABBIXSERVER:~# ./2.6.sh IP fan {#NAMEFAN}
root@ZABBIXSERVER:~# ./2.6.sh IP volt {#NAMEVOLT}

Скрипт V3.0 на команде sensors -u
root@ZABBIXSERVER:~# ./3.sh IP discovery
{"data":[
{"{#CHIP}":"acpitz-virtual-0", "{#SENSOR}":"temp1", "{#NAMETEMP}":"AdapterVirtualdevice", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp1", "{#NAMETEMP}":"Physicalid0", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp2", "{#NAMETEMP}":"Core0", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp3", "{#NAMETEMP}":"Core1", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp4", "{#NAMETEMP}":"Core2", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp5", "{#NAMETEMP}":"Core3", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"}
]}
root@ZABBIXSERVER:~#
Вывод sensors V3.0.jpg
Вывод sensors V3.0
Запрос значения напрямую минуя скрипт
root@ZABBIXSERVER:~# sensor {#CHIP} {#SENSOR}

Запрос значения через скрипт
root@ZABBIXSERVER:~# ./3.sh IP sensor {#CHIP} {#SENSOR}

Общее для всех скриптов
root@ZABBIXSERVER:~# 3.sh IP info
root@ZABBIXSERVER:~# 3.sh IP maxtemp
Описание команд в скрипте для sensors -u
Показать
grep -E поиск фильтрация определенного параметра или слова в тексте строке
cut - Команда cut позволяет вам вырезать данные по символам, по полю или по столбцу
tr - Утилита tr копирует стандартный входной поток в стандартный выходной, подставляя или удаляя некоторые символы
SEP=""
for chip in $($get -u 2>/dev/null|grep -E "^[^:]+$") первый этап выполнить sensors -u, если ошибка отправить все в черную дыру, выбрать имя чипа
do
while read sensor Втрой этап сперва выполняется первое done <<<
do
case $sensor in этап 3 выбираются данные по имени задается соотноешие единица измерения
temp*)
UNITS="°C"
;;
in*)
UNITS="V"
;;
fan*)
UNITS="RPM"
;;
*)
UINTS=""
;;
esac
/bin/echo -e "\t\t{\"{#CHIP}\":\"$chip\", \"{#SENSOR}\":\"$sensor\", \"{#UNITS}\":\"$UNITS\"}$SEP" готовый вывод data
SEP=", "
done <<<$($get -u $chip 2>/dev/null|grep -E "_input:"|tr -d " "|cut -d_ -f1) второй этап оставляем имена датчиков (

Запускается команда sensors -u с дополнительной опцией именем чипа (чипы перепираются все по очереди) отдает значение соответствующиму данному чипу, обрезаем все лешнее оставляя только имена датчиков. grep -E "_input:" найти строку _input: и оставить значение до ее, имя. tr -d " " удалить все пробелы. cut -d_ -f1 -обрезать все после _
done

для шаблона инфо
Через заббикс агент Ключ поиска discovery.sensor раз в 3600 происходит просто запуск скрипта
Элемент
Имя {#SENSOR} on {#CHIP}
Ключ sensor[{#CHIP},{#SENSOR}] sensor|coretemp-isa-0000|temp5
числовой с плавающей точкой
Единица измерения {#UNITS}
Интервал 300

root@ZABBIXSERVER:~# zabbix_get -s 192.168.60.111 -k sensor[coretemp-isa-0000,temp1]
21.000000
подробнее как идет запрос напрямую без скрипта через агента

из программы root@ZABBIXSERVER:~# ./2.sh
{
"data":[
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp5", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp4", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp3", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp2", "{#UNITS}":"°C"},
{"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp1", "{#UNITS}":"°C"},
{"{#CHIP}":"acpitz-virtual-0", "{#SENSOR}":"temp1", "{#UNITS}":"°C"}
]
}

$get -u выводит сообщение об ошибке и завершает скрипт, при попытке использования не инициализированной переменной
2>/dev/null - если ответ ошибка в черную дыру все
0 — STDIN вход (Ввод с клавиатуры) , 1 — STDOUT выход(Вывод в окно командной строки) 2 — STDERR (ошибка)
UNDEFINED 3-9 Эти дескрипторы определяются индивидуально для каждой прикладной программы.

> Записывает данные на выходе команды вместо командной строки в файл или на устройство, например, на принтер
> — перенаправление потока вывода в файл (файл будет создан, или перезаписан)
2> — перенаправляет поток ошибок в файл (log) (файл будет создан, или перезаписан)
>> — дописать поток вывода в конец файла;
>> Добавляет выходные данные команды в конец файла, не удаляя при этом существующей информации из файла.
2>> — дописать ошибки в конец файла;
>> - стандартный вывод

< — перенаправляет данные из файла в поток ввода;
< Читает поток входных данных команды из файла, а не с клавиатуры.
<< - получение данные из стандартного потока ввода до тех пор, пока не встретится разделитель
<< - стандартный ввод
<<< - Использование строки Here
<<< — чтение данных из строки, вместо всего содержимого файла (работает для bash 3+)

Пример
О here
Еще примеры построчного цикла
Показать
Чтение файла построчные примеры
while read LINE; do команда например echo; done < Входной файл с данными строками

Использование процесса замены Подстановка процесса позволяет вам передавать вывод команды в виде имени файла:
while IFS= read -r line; do echo "$line" ; done < <(cat Входной файл)

Использование строки Here Здесь строка является вариантом heredoc. Строка (cat Входной файл ) будет содержать новые строки:
while IFS= read -r line; do echo "$line"; done <<< $(cat Входной файл)

Использование файлового дескриптора

Вы также можете предоставить вход для цикла, используя дескриптор файла:
При работе с файловыми дескрипторами используйте число от 4 до 9, чтобы избежать конфликта с внутренними файловыми дескрипторами оболочки
while IFS= read -r -u9 line; do echo "$line"; done 9< Входной файл


[COMMAND] <<[-] 'DELIMITER'
HERE-DOCUMENT
DELIMITER
специальный оператор перенаправления << и идентификатор-разделитель
знак минуса к оператору перенаправления <<- приведет к игнорированию всех начальных символов табуляции. Это позволяет использовать отступы при написании здесь документов в сценариях оболочки. Не допускаются начальные пробельные символы, только табуляция.
Проверка версии bash --version
GNU bash, версия 4.4.12(1)-release (x86_64-pc-linux-gnu)

root@ZABBIXSERVER:~# sensors -u | egrep "^[^:]+$" команда оставляет имена чипа
k8temp-pci-00c3
nouveau-pci-0200

for chip in $($get -u 2>/dev/null|$EGREP "^[^:]+$") полчаем имена чипа
for chip in $ для данной переменной
While в том, что он будет повторяться до тех пор, пока будет выполняться условие, указанное в объявлении цикла sensor
CASE, Вы один раз берете какую-либо переменную и множество раз проверяете ее $sensor

root@ZABBIXSERVER:~# sensors -u |grep -E "_input:"|tr -d " "|cut -d_ -f1 оставляем имена температур
temp1
temp1
temp2
temp3
temp4
temp5

root@ZABBIXSERVER:~# sensors -u acpitz-virtual-0 |grep -E "_input:"|tr -d ""|cut -d_ -f1
temp1

root@ZABBIXSERVER:~# echo `zabbix_get -s 192.168.350.141 -k system.run["sensors -u acpitz-virtual-0"]`
acpitz-virtual-0 Adapter: Virtual device temp1: temp1_input: 29.800 temp1_crit: 100.000

ключ sensor[{#CHIP},{#SENSOR}]
./2.sh sensor | coretemp-isa-0000 | temp5

root@ZABBIXSERVER:~# zabbix_get -s 192.168.350.141 -k sensor[coretemp-isa-0000,temp5]
21.000000
# ./lm-sensors.sh 192.168.353.141 sensor i5k_amb-isa-0000 temp4
40.000000

root@ZABBIXSERVER:~# sensors -u 2>/dev/null| tr -d ' '|grep -E "[:^]+$" для соотношения имен
temp1:
Physicalid0:
Core0:
Core1:
Core2:
Core3:

Обрезать двоеточие добавим | tr -d ':'

Взять значение из предыдущей строки
root@ZABBIXSERVER:~# sensors -u | grep -B1 -P 'temp3'| grep -vP 'temp3'| tr -d ':'| tr -d ' ' взять значение из предыдущей строки от значения temp3
Core1

root@ZABBIXSERVER:~# sensors -u | sed -n '/temp3/{g;1!p;};h' другой вариант
Core 1:

root@ZABBIXSERVER:/usr/local/share/zabbix/externalscripts# ./lm-sensors.sh 192.168.353.141 discovery
{"data":[{"{#CHIP}":"acpitz-virtual-0", "{#SENSOR}":"temp1", "{#NAMETEMP}":"AdapterVirtualdevice", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"}, {"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp1", "{#NAMETEMP}":"Physicalid0", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"}, {"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp2", "{#NAMETEMP}":"Core0", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"}, {"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp3", "{#NAMETEMP}":"Core1", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"}, {"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp4", "{#NAMETEMP}":"Core2", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"}, {"{#CHIP}":"coretemp-isa-0000", "{#SENSOR}":"temp5", "{#NAMETEMP}":"Core3", "{#NAMEFAN}":"", "{#NAMEVOLT}":"", "{#UNITS}":"°C"}]}

root@ZABBIXSERVER:/usr/local/share/zabbix/externalscripts# ./lm-sensors.sh 192.168.353.141 maxtemp
29

root@ZABBIXSERVER:/usr/local/share/zabbix/externalscripts# ./lm-sensors.sh 192.168.353.141 sensor coretemp-isa-0000 temp2 20.000000

root@ZABBIXSERVER:/usr/local/share/zabbix/externalscripts# ./lm-sensors.sh 192.168.353.141 info отдаст камаду sensors
Команды для тестирования
Показать
Просто в терминале где установлена утилита LM Sensor
sensors
sensors -u


Можно поэкспериментировать так подставляя значения и команды
sensors| grep °C | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '

sensors| tr -d ' ' | grep °C | awk '{print NR "" $0 }' | grep Имя датчика:| cut -f 2 -d +| grep -oE '^..'
sensors| cut -d"(" -f1 | tr -d ' ' | grep °C | awk '{print NR "" $0 }' | grep имя датчика:| cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1

sensors| cut -d"(" -f1 | grep °C | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '
sensors| tr -d ' ' | grep °C | cut -f 2 -d +| grep -oE '^..' | sort -nk1 | tail -n 1

sensors -u 2>/dev/null|grep -E "^[^:]+$"
sensors -u acpitz-virtual-0 2>/dev/null|grep -E "_input:"|tr -d " "|cut -d_ -f1
sensors -u coretemp-isa-0000 2>/dev/null|grep -E "_input:"|tr -d " "|cut -d_ -f1
sensors -u coretemp-isa-0000 2>/dev/null|grep -B1 -P "temp2"| grep -vP "temp2"| tr -d ':'| tr -d ' '

Команда запроса через zabbix_get -s на удаленный хост
zabbix_get -s 192.168.387.181 -p 10050 -k system.run["sensors"]
zabbix_get -s 192.168.387.181 -p 10050 -k system.run["sensors -u"]


Запрос напрямую минуя скрипт
zabbix_get -s 192.168.387.181 -k sensors[coretemp-isa-0000,temp5]
Ключ будет иметь вид
sensor[coretemp-isa-0000,temp5]
Официальная документация о команде Сенсор

Через скрипт
Запрос имен датчиков
./lm-sensors.sh 192.168.534.50 discovery

Запрос всего листинга команды
./lm-sensors.sh 192.168.534.50 info

Запрос максимальной температуры на данном Хосте
./lm-sensors.sh 192.168.534.50 maxtemp

Запрос уже с входным именем например temp1 и получение для него значения т.е. температуры
./lm-sensors.sh 192.168.534.50 temperature temp1

От версии V2.5 2.6
./lm-sensors.sh 192.168.534.50 fan подставляем имя
./lm-sensors.sh 192.168.534.50 volt подставляем имя


Версии V2.6 изменен запрос разбито на категории
./lm-sensors.sh 192.168.534.50 discovery.temp
./lm-sensors.sh 192.168.534.50 discovery.fan
./lm-sensors.sh 192.168.534.50 discovery.volt


Версии V3.0
./lm-sensors.sh 192.168.534.50 sensor coretemp-isa-0000 temp1
Описание команд примененных в скриптах
Показать
Команда запроса через zabbix_get -s
zabbix_get -s 192.168.387.181 -p 10050 -k system.run["sensors"]
zabbix_get -s 192.168.387.181 -p 10050 -k system.run["sensors -u"]

создаем скрипт пишем код, команды nano lm-sensors.sh сохраняем по F2 подтвердить Y
Даем на его права chmod 777 lm-sensors.sh
запускаем ./lm-sensors.sh или ./lm-sensors.sh $1 $2 где переменые например ./lm-sensors.sh 192.168.534.50 discovery

grep °C выбрать строки с °C
sed 's/:.*//' убрать двоеточие :
grep -o '[^"]*:[^"]*' остается только датчик и температура
cut -d":" -f1 обрезать все поле двоеточия :
tr -d ' ' - убрать пробелы в именах (не работает ключ с пробелами)
grep -Eo '[0-9]+' выбираем положительные циферные значения
sort -nk1 сортировка от меньшему к большему
sort -rn сортировка от большего к меньшему
tail -n 1 выбор последнего значения
head -1 выбор первого верхнего значения
cut -d"(" -f1 вырезать все после скобок ( втом числе и саму скобку
cut -f 2 -d + вырезать в строке где есть + все что до + и сам +

IFS=$'\n' игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.
if [[ -n ${obr} ]] - преобразовать данные в одну строку для формирования jons data строки
echo -n - все одной строкой
echo -e - поодержка вывода последовательности
с включеной -e опции
/c - удалить перевод строки;
/t - горизонтальная табуляция;
/v - вертикальная табуляция;
/b - удалить предыдущий символ;
/n - перевод строки;
/r - символ возврата каретки в начало строки

nl команда нумерации строк содержит пробелы не подходит
awk '{print NR "" $0 }' - нумерация строк для присвоения номера к имени встречаются одинаоковые имена

Выбрать текст от до
sed -n '/НАЧАЛО_ДИАПАЗОНА/,/КОНЕЦ_ДИАПАЗОНА/p' ФАЙЛ
awk '/zdk/,/dke/' ФАЙЛ
Использование опции -n подавляет автоматический вывод, то есть будут напечатаны только строки, для которых это явно запрошено.
/^$/ - до пустой строки
filter=$(echo "${get}" 2>/dev/null| sed -n "/"${chip}"/,/^$/p")

Пример sensors -u | sed -n '/coretemp-isa-0000/,/^$/p'

sensors|grep 'temp1:'|cut -c16-17
запуск утилиты | посик строки temp1: | оставить в данной строке символы с 16 по 17
получаем температуру 29

sensors|grep 'Core 0:'|cut -f 2 -d +
запуск утилиты | посик строки Core 0:|cut -f 2 -d + вырезать в строке где есть + все что до + и сам +
ответ 18.0°C (high =

sensors|grep 'Core 0:'| cut -f 2 -d +| grep -o '[^*+]*[°*$]'
запуск утилиты | посик строки Core 0:| cut -f 2 -d + вырезать в строке где есть + все что до + и сам +| поиск значения + до °
ответ 18.0°

sensors|grep 'Core 1:'| cut -f 2 -d +| grep -oE '^..'
запуск утилиты | посик строки Core 1:| cut -f 2 -d + вырезать в строке где есть + все что до + и сам +| оставить 2 значения означает две ..
Ответ 29

sensors|grep 'temp1:'| cut -f 2 -d +| grep -oE '^....'
аналогично команде выше но 4 значения , если будет стоят 4 точки, а значение будет 2 в ответ попардет °C
Ответ 29.8

Получаем JSON data
`echo "${get}" | cut -d"(" -f1 | grep °C | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
Команда сеносрс | вырезать значение в () и сами скобки | выдать строки содержащие °C | Нумерация строк | вырезать все после включая : (двоеточия) | удалить пробеллы
получаем пронумерованные имена датчиков температуры например 1Core0
Дальше подставляем все имена в JSON data

Температура по имени датчика
sensors | cut -d"(" -f1 | tr -d ' ' | grep °C | awk '{print NR "" $0 }' | grep $2:| cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1`
Команда сеносрс | вырезать значение в () и сами скобки | удалить пробеллы | выдать строки содержащие °C | Нумерация строк | Подставить имя датчка температуры | верезать все до : и само : | верезать все до + и сам + | вырезать . точку и все после нее
остается целое положительное число или число с - минусом

Максимальная температура из всех датчиков
sensors | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
Команда сеносрс | вырезать значение в () и сами скобки | удалить пробелы | выдать строки содержащие °C | вырезать все до : и само : | вырезать все до + и сам + (- не трогается) | верезать . точку и все после нее | сортирова от большего к меньшему | выбор последнего значения большего
Получаем максимальную температуру

Без нумерации
sensors | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1
Команда сеносрс | вырезать значение в () и сами скобки | удалить пробелы | выдать строки содержащие °C | вырезать все до : и само : | вырезать все до + и сам + (- не трогается) | верезать . точку и все после нее
получим целое число

Можно оставить так без нумерации
sensors | tr -d ' ' | grep °C | cut -d"(" -f1 | cut -d":" -f2
Но надо делать предобработку элемента обрезку Начало + и в конце °C

это параметры $1 $2
./lm-sensors.sh 192.168.221.10 discovery
{"data":[{"{#NAMETEMP}":"Packageid0"}, {"{#NAMETEMP}":"Core0"}, {"{#NAMETEMP}":"Core1"}, {"{#NAMETEMP}":"temp1"}, {"{#NAMETEMP}":"temp2"}, {"{#NAMETEMP}":"temp1"}]}

root@ZABBIXSERVER:~# sensors | cut -d":" -f1
acpitz-virtual-0
Adapter
temp1

coretemp-isa-0000
Adapter
Physical id 0
Core 0
Core 1
Core 2
Core 3

root@ZABBIXSERVER:~# sensors | grep C
temp1: +29.8°C (crit = +100.0°C)
Physical id 0: +25.0°C (high = +74.0°C, crit = +94.0°C)
Core 0: +23.0°C (high = +74.0°C, crit = +94.0°C)
Core 1: +24.0°C (high = +74.0°C, crit = +94.0°C)
Core 2: +24.0°C (high = +74.0°C, crit = +94.0°C)
Core 3: +25.0°C (high = +74.0°C, crit = +94.0°C)

root@ZABBIXSERVER:~# sensors | grep C | cut -d":" -f1
temp1
Physical id 0
Core 0
Core 1
Core 2
Core 3

Пишем скрипт
#!/bin/bash
# 2019/05/20 v1.0
# Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)

# Автообнаружение параметров из Lm-sensor
# Ключ: discovery temp/in/fan

# $1 - это IP и порт узла подключаемого агента
# $2 - Это весь листинг команды sensor

IFS=$'\n' есть описание выше
JSON="{\"data\":[" начало стандарт для данных jons
SEP=""

get=`zabbix_get -s $1 -k system.run["sensors"]` запрос полных данных полный листинг команды sensors
obr=sed 's/:.*//' $get оставляем текст до : то есть имя элемента дающего температуру
for NAMETEMP in $obr берем имена и подставляем их вместо NAMETEMP запускается цикл пока есть данные
do
JSON=$JSON"$SEP{\"{#NAMETEMP}\":\"$NAMETEMP\"}" подставляем данные
SEP=", " повторяем через запятую количество данных for
done
JSON=$JSON"]}" закрываем данные
echo $JSON вывод данных

нужно получить
{"data":[{"{#NAMETEMP}":"temp1"},{"{#NAMETEMP}":"Physicalid0"},{"{#NAMETEMP}":"Core0"},{"{#NAMETEMP}":"Core1"},{"{#NAMETEMP}":"Core2"},{"{#NAMETEMP}":"Core3"}]}
Версии скриптов описание
Показать
LDD
Можно использовать которые с +
Скрипты на команде sensors
V1.0 - поиск датчиков температуры
+V2.0 - дополнено удаление данных в скобках , значение температуры берется цело значение, а не 2 значения после +,
так же улучшена обработка с минусовой температурой в значение попадает не название датчика а целое значение минусовой температуры.
V2.5 - добавление датчиков напряжения и кулеров попытка сделать все одним discovery не очень удачная команда обрабатывается несколько раз параметром do,
либо все попадает в раздел температуры (если нет например fan или volt то data выходит пустой)
+V 2.6 - разделение discovery по датчикам
Скрипты на команде sensors -u
V 2.7 - работает по команде sensors -u , создавшийся элемент работает напрямую без использования скрипта, так же из предыдущих скриптов оставлено макстемп и инфо
из минусов в момент обнаружения нельзя создать триггер так как не известно элемент будет температура или напряжение, обороты. Так же не видно чего температура нет имени (только название чипа и temp*)
из за echo "${get}" дублирует к каждому имени чипа элемент имя температуры получаются дубли
V2.9 - Добавлено соотношение имя датчика NAME**** , не решена проблема дублей имени к сенсору
+V3.0 - Решена проблема дублей (добавлено входящие данные в скрипт для внешней проверки)
Скрипт V3.0 рекомендуемый на команде sensors -u
Показать
#!/bin/bash
#2019/08/12 v3.0
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

#Автообнаружение параметров из Lm-sensor
#Ключ: discovery temp/in/fan

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

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

if [[ $2 = "discovery" ]]
then
# Запуск переменной get команды sensors -u
get=`zabbix_get -s $1 -k system.run["sensors -u"]`
# 1шаг Выбираем имена чипов в переменную chip если ошибка отправка в черную дыру
for chip in $(echo "${get}" 2>/dev/null|grep -E "^[^:]+$")
do
# Запуск переменной filter это команда sensors -u с подстановкой перебором имён чипа которые получены в переменной chip (фильтрация по чипам)
#filter=`zabbix_get -s $1 -k system.run["sensors -u $chip"]`
# взято из переменной выше
filter=$(echo "${get}" 2>/dev/null| sed -n "/"${chip}"/,/^$/p")
#echo "${filter}"
# чтение сенсоров получение переменной sensor
while read sensor
do
#3шаг Поиск строк содержащие например temp значит температура выше имени температуры взять имя чья температура и присвоить Ед. измерения °C и т.д.
case $sensor in
temp*)
# Вывод переменной filter| взять значение из предыдущей строки от значения $sensor | Обрезать двоеточие| удалить пробелы
NAMETEMP=`echo "${filter}" | grep -B1 -P "$sensor"| grep -vP "$sensor"| tr -d ':'| tr -d ' '`
UNITS="°C"
;;
fan*)
NAMEFAN=`echo "${filter}" | grep -B1 -P "$sensor"| grep -vP "$sensor"| tr -d ':'| tr -d ' '`
UNITS="RPM"
;;
in*)
NAMEVOLT=`echo "${filter}" | grep -B1 -P "$sensor"| grep -vP "$sensor"| tr -d ':'| tr -d ' '`
UNITS="V"
;;
*)
UINTS=""
;;
esac
JSON=$JSON"$SEP\n{\"{#CHIP}\":\"$chip\", \"{#SENSOR}\":\"$sensor\", \"{#NAMETEMP}\":\"$NAMETEMP\", \"{#NAMEFAN}\":\"$NAMEFAN\", \"{#NAMEVOLT}\":\"$NAMEVOLT\", \"{#UNITS}\":\"$UNITS\"}"
SEP=", "
# Использование строки Here,чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) это перовое do (обрабатываем все в скобках с подстановкой из цикла) и получаем переменные вывода первого do
# Вывод переменной filter если ответ 2 ошибка в черную дыру все|найти строку _input: и оставить значение до ее| удалить все пробелы| обрезать все после _
done<<<$(echo "${filter}" 2>/dev/null|grep -E "_input:"|tr -d " "|cut -d_ -f1)
# 2шаг обработка построчно запуск filter поиск строк с _input: и вырезка имени до _input: получаем список имён распределенных по чипам
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp
# Вход данных для работы через внешнюю проверку где нет агента lm-sensors.sh[{HOST.CONN},sensor,{#CHIP},{#SENSOR}]

else
if [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in $get
do
echo "${out}"
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок ( в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# вырезать все до : и само :| вырезать в строке где есть + все что до + и сам + | вырезать . точку и все после нее| сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
elif [[ $2 = "sensor" ]]
then
# Запуск переменной vxod с 2 входными данными
vxod=`zabbix_get -s $1 -k sensor[$3,$4]`
# Вывод значения переменной циклом
for out in $vxod
do
echo "${out}"
done
fi
fi
Шаблон для Linux LLD LM-Sensors V2.9-3.0 скрины
Шаблон для Linux LLD LM-Sensors V2.9-3.0.jpg
Шаблон для Linux LLD LM-Sensors V2.9-3.0
2 Шаблон для Linux LLD LM-Sensors V2.9-3.0.jpg
2 Шаблон для Linux LLD LM-Sensors V2.9-3.0
Скрипты на команде sensor запрос элемента ключа, получения значения происходит через скрипт, а не напрямую как выше в скрипте через команду sensor -u

Отличие от предыдущих скриптов в V2.6 том что поиск разделен на категории Температура, Кулера, Напряжение, так же разделено и входящие ключи по категориям.
Скрипт V2.6 отдельное обнаружение температуры напряжения кулеров не тестировался в реальных условиях
Показать
#!/bin/bash
# testov 2019/07/30 v2.6
# При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
# Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

# Автообнаружение параметров из Lm-sensor
# Ключ: discovery temp/in/fan

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

# Поиск датчиков тепературы

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

if [[ $2 = "discovery.temp" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| Поиск (выбор) строк температуры °C|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : |убрать пробелы в именах (для ключа)
obrTemp=`echo "${get}" | cut -d"(" -f1 | grep °C | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
# преобразовать данные в одну строку для формирования
if [[ -n ${obrTemp} ]];
then
# Вывод значения переменной циклом
for NAMETEMP in ${obrTemp}; do
JSON=$JSON"$SEP\n{\"{#NAMETEMP}\":\"$NAMETEMP\"}"
SEP=", "
done
# Выводим имена датчиков температур без пробелов с нумерацией
JSON=$JSON"\n]}"
echo -e $JSON
fi

# Подстановка имени датчика температуры например Core0 lm-sensors.sh[{HOST.CONN},temperatyra,Core0]
# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp

else
if [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in $get
do
echo "${out}"
done
elif [[ $2 = "temperature" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|
# вырезать все до : и само : | вырезать все до + и сам + | вырезать . точку и все после нее остается целое положительное число или число с - минусом
imyatemp=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep °C | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1`
# Вывод значения переменной циклом
for out in $imyatemp
do
echo $out
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок ( втом числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# вырезать все до : и само :| вырезать в строке где есть + все что до + и сам + | вырезать . точку и все после нее| сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
fi
fi

# Поиск датчиков Кулеров

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

if [[ $2 = "discovery.fan" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| Поиск (выбор) строк Для кулеров обороты RPM|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : |убрать пробелы в именах (для ключа)
obrFan=`echo "${get}" | cut -d"(" -f1 | grep RPM | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
# преобразовать данные в одну строку для формирования
if [[ -n ${obrFan} ]];
then
# Вывод значения переменной циклом
for NAMEFAN in ${obrFan}; do
JSON=$JSON"$SEP\n{\"{#NAMEFAN}\":\"$NAMEFAN\"}"
SEP=", "
done
# Выводим имена датчиков кулеров без пробелов с нумерацией
JSON=$JSON"\n]}"
echo -e $JSON
fi

# Подстановка имени датчика температуры например fan1 lm-sensors.sh[{HOST.CONN},fan,fan1]

else
if [[ $2 = "fan" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк Кулеров RPM|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|
# вырезать все до : и само : | вырезать все до + и сам + | вырезать . точку и все после нее остается целое положительное число или число с - минусом
imyafan=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep RPM | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"R" -f1`
# Вывод значения переменной циклом
for out in $imyafan
do
echo $out
done
fi
fi

# Поиск датчиков напряжения

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

if [[ $2 = "discovery.volt" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| Поиск (выбор) строк Для Напряжения V |
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : |убрать пробелы в именах (для ключа)
obrV=`echo "${get}" | cut -d"(" -f1 | grep V | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
# преобразовать данные в одну строку для формирования
if [[ -n ${obrV} ]];
then
# Вывод значения переменной циклом
for NAMEVOLT in ${obrV}; do
JSON=$JSON"$SEP\n{\"{#NAMEVOLT}\":\"$NAMEVOLT\"}"
SEP=", "
done
# Выводим имена датчиков Напряжения без пробелов с нумерацией
JSON=$JSON"\n]}"
echo -e $JSON
fi

# Подстановка имени датчика температуры например in1 lm-sensors.sh[{HOST.CONN},volt,in1]

else
if [[ $2 = "volt" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк Напряжения V|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|
# вырезать все до : и само : | вырезать все до + и сам + | вырезать . точку и все после нее остается целое положительное число или число с - минусом
imyavolt=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep V | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"V" -f1`
for out in $imyavolt
# Вывод значения переменной циклом
do
echo $out
done
fi
fi
Шаблон для Linux LLD LM-Sensors V2.6 скрины
Шаблон для Linux LLD LM-Sensors V2.6.jpg
Шаблон для Linux LLD LM-Sensors V2.6
2Шаблон для Linux LLD LM-Sensors V2.6.jpg
2Шаблон для Linux LLD LM-Sensors V2.6
3Шаблон для Linux LLD LM-Sensors V2.6.jpg
3Шаблон для Linux LLD LM-Sensors V2.6

Первый скрипт V1.0 - поиск датчиков температуры
Первый скрипт V1.0 для температуры рабочий но если есть строки содержащие одно значение со скобками не пойдет
Показать
#!/bin/bash
# 2019/05/20 v1.0
# При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
# Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

# Автообнаружение параметров из Lm-sensor
# Ключ: discovery temp/in/fan

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

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

if [[ $2 = "discovery" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| Поиск (выбор) строк температуры °C| нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : |убрать пробелы в именах (для ключа)
obr=`echo "${get}" | grep °C | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
# преобразовать данные в одну строку для формирования
if [[ -n ${obr} ]]; then
# Запускаем цикл обрабатываем построчно всю таблицу температур
for NAMETEMP in ${obr};
do
JSON=$JSON"$SEP\n{\"{#NAMETEMP}\":\"$NAMETEMP\"}"
SEP=", "
done
# Выводим имена датчиков температур без пробелов с нумерацией
JSON=$JSON"\n]}"
echo -e $JSON
fi

# Подстановка имени датчика температуры например Core0 lm-sensors.sh[{HOST.CONN},temperatyra,Core0]
# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp]

else
if [[ $2 = "temperature" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| убрать пробелы в именах| Поиск (выбор) строк температуры °C| нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|
# вырезать в строке где есть + все что до + и сам + | оставить 2 значения означает две ..
imyatemp=`echo "${get}" | tr -d ' ' | grep °C | awk '{print NR "" $0 }' | grep $3:| cut -f 2 -d +| grep -oE '^..'`
# Вывод значения переменной циклом
for out in $imyatemp
do
echo $out
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| убрать пробелы в именах| Поиск (выбор) строк температуры °C| вырезать в строке где есть + все что до + и сам + | оставить 2 значения означает две .. | сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | tr -d ' ' | grep °C | cut -f 2 -d +| grep -oE '^..' | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
elif [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in ${get}
do
echo "${out}"
done
fi
fi
Скрипт v2.0 только для температуры
Изменения отличия V2.0 от V1.0
Показать
Добавлено изменено V2.0 - дополнено удаление данных в скобках cut -d"(" -f1 , значение температуры берется цело значение, а не 2 значения после +,
так же улучшена обработка с минусовой температурой в значение попадает не название датчика а целое значение минусовой температуры. (cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1)

Пример если значение строка начинается со скобки (
temp1: +45.0В°C (high = +95.0В°C, hyst = +3.0В°C)
(crit = +105.0В°C, hyst = +5.0В°C)
Скрипт v2.0 только для температуры
Показать
#!/bin/bash
# 2019/07/30 v2.0
# При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
# Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

# Автообнаружение параметров из Lm-sensor
# Ключ: discovery temp/in/fan

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

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

if [[ $2 = "discovery" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| Поиск (выбор) строк температуры °C| нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : |убрать пробелы в именах (для ключа)
obr=`echo "${get}" | cut -d"(" -f1 | grep °C | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
# преобразовать данные в одну строку для формирования
if [[ -n ${obr} ]]; then
# Запускаем цикл обрабатываем построчно всю таблицу температур
for NAMETEMP in ${obr};
do
JSON=$JSON"$SEP\n{\"{#NAMETEMP}\":\"$NAMETEMP\"}"
SEP=", "
done
# Выводим имена датчиков температур без пробелов с нумерацией
JSON=$JSON"\n]}"
echo -e $JSON
fi

# Подстановка имени датчика температуры например Core0 lm-sensors.sh[{HOST.CONN},temperatyra,Core0]
# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp]

else
if [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in ${get}
do
echo "${out}"
done
elif [[ $2 = "temperature" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C| нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|
# вырезать все до : и само : | вырезать все до + и сам + | вырезать . точку и все после нее остается целое положительное число или число с - минусом
imyatemp=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep °C | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1`
# Вывод значения переменной циклом
for out in $imyatemp
do
echo $out
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок ( втом числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# вырезать все до : и само :| вырезать в строке где есть + все что до + и сам + | вырезать . точку и все после нее| сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
fi
fi
Шаблон для Linux LLD LM-Sensors V1.0-2.5 скрины
Шаблон для Linux LLD LM-Sensors V1.0-2.5.jpg
Шаблон для Linux LLD LM-Sensors V1.0-2.5
2 Шаблон для Linux LLD LM-Sensors V1.0-2.5.jpg
2 Шаблон для Linux LLD LM-Sensors V1.0-2.5
3 Шаблон для Linux LLD LM-Sensors V1.0-2.5.jpg
3 Шаблон для Linux LLD LM-Sensors V1.0-2.5
03.2020 Добавлено прототип групп в прототипе эдемента
LM-Sensor прототипы групп.jpg
LM-Sensor прототипы групп.jpg
Последний раз редактировалось Артём Мамзиков Сб янв 18, 2020 18:23, всего редактировалось 18 раз.

Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 336
Зарегистрирован: Вс фев 17, 2019 17:47
Репутация: 4
Откуда: Вологодская область
Контактная информация:

Скрипт + Шаблон для Linux LLD LM-Sensors

Сообщение Артём Мамзиков » Ср янв 08, 2020 16:04 #2

↓↓↓Ниже скрипты Неработающие или неверно работающие так для истории↓↓↓

Отличие от V2.0 в V2.5 Попытка сделать вывод не только температуры, но и кулеров и напряжения 3 обработки с раздельными переменными в одном цикле не есть хорошая идея была.
Скрипт V2.5 не рабочий нужно делать циклы for попытка создать для температуры напряжения и кулеров через одно discovery
Показать
#!/bin/bash
# testov 2019/07/30 v2.5
# При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
# Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

# Автообнаружение параметров из Lm-sensor
# Ключ: discovery temp/in/fan

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

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

if [[ $2 = "discovery" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| Поиск (выбор) строк температуры °C|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : |убрать пробелы в именах (для ключа)
obrTemp=`echo "${get}" | cut -d"(" -f1 | grep °C | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| Поиск (выбор) строк Для кулеров обороты RPM |
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : |убрать пробелы в именах (для ключа)
obrFan=`echo "${get}" | cut -d"(" -f1 | grep RPM | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| Поиск (выбор) строк Для Напряжения вольт V |
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : |убрать пробелы в именах (для ключа)
obrV=`echo "${get}" | cut -d"(" -f1 | grep V | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
# преобразовать данные в одну строку для формирования
# if [[ -n ${obrTemp} ]];
# then
# Запускаем цикл обрабатываем построчно всю таблицу температур кулеров напряжения, не очень идея была
for NAMETEMP in ${obrTemp}; do for NAMEFAN in ${obrFan}; do for NAMEVOLT in ${obrV}; do
JSON=$JSON"$SEP\n{\"{#NAMETEMP}\":\"$NAMETEMP\", \"{#NAMEFAN}\":\"$NAMEFAN\", \"{#NAMEVOLT}\":\"$NAMEVOLT\"}"
SEP=", "
done
done
done
# Выводим имена датчиков температур без пробелов с нумерацией
JSON=$JSON"\n]}"
echo -e $JSON
# fi

# Подстановка имени датчика температуры например Core0 lm-sensors.sh[{HOST.CONN},temperatyra,Core0]
# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp

else
if [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in $get
do
echo "${out}"
done
elif [[ $2 = "temperature" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C| нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|
# вырезать все до : и само : | вырезать все до + и сам + | вырезать . точку и все после нее остается целое положительное число или число с - минусом
imyatemp=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep °C | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1`
# Вывод значения переменной циклом
for out in $imyatemp
do
echo $out
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок ( втом числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# вырезать все до : и само :| вырезать в строке где есть + все что до + и сам + | вырезать . точку и все после нее| сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
elif [[ $2 = "fan" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк Для кулеров обороты RPM| нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|
# вырезать все до : и само : | вырезать все до + и сам + | вырезать . точку и все после нее остается целое положительное число или число с - минусом
imyafan=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep RPM | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"R" -f1`
# Вывод значения переменной циклом
for out in $imyafan
do
echo $out
done
elif [[ $2 = "volt" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок (в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк Для Напряжения вольт V| нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|
# вырезать все до : и само : | вырезать все до + и сам + | вырезать . точку и все после нее остается целое положительное число или число с - минусом
imyavolt=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep V | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"V" -f1`
# Вывод значения переменной циклом
for out in $imyavolt
do
echo $out
done
fi
fi
Скрипт версии V2.7 для команды sensors -u попытка создания не правильно работающий
Показать
#!/bin/bash
# 2019/08/05 v2.7
# При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
# Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data по команде sensors -u, и отдельно maxtemp, info по команде sensors
# Обратных входных данных нет сформировавшийся ключ работает напрямую (zabbix_get -s IP -k sensor[имя чипа,имя сенсора])

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

if [[ $2 = "discovery" ]]
then
# Запуск переменной get команды sensors -u
get=`zabbix_get -s $1 -k system.run["sensors -u"]`
# Запускаем цикл в переменную чип, данные переменой выше если 2 ответ ошибка в черную дыру все | выбрать имя чипа
for chip in $(echo "${get}" 2>/dev/null|grep -E "^[^:]+$")
do
# чтение сенсоров получение переменной sensor
while read sensor
do
# Добавлено в цикл Соответствие к категории датчиков Юнитов Единиц измерений
case $sensor in
temp*)
UNITS="°C"
;;
in*)
UNITS="V"
;;
fan*)
UNITS="RPM"
;;
*)
UINTS=""
;;
esac
JSON=$JSON"$SEP\n{\"{#CHIP}\":\"$chip\", \"{#SENSOR}\":\"$sensor\", \"{#UNITS}\":\"$UNITS\"}"
SEP=", "
# Использование строки Here,чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) это перовое do (обрабатываем все в скобках с подстановкой из цикла) и получаем переменные вывода первого do
# Вывод переменной если ответ 2 ошибка в черную дыру все| найти строку _input: и оставить значение до ее| удалить все пробелы| -обрезать все после _
done <<<$(echo "${get}" $chip 2>/dev/null|grep -E "_input:"|tr -d " "|cut -d_ -f1)
#done|tac
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp]

else
if [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in ${get}
do
echo "${out}"
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок ( в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# вырезать все до : и само :| вырезать в строке где есть + все что до + и сам + | вырезать . точку и все после нее| сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
fi
fi
по пытка присвоить имя v2.7.1lm-sensors.sh
Показать
#!/bin/bash
# 2019/07/30 v2.7
# При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
# Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data по команде sensors -u, и отдельно maxtemp, info покоманде sensors
# Обратных входных данных нет сформировавшийся ключ работает напрямую (zabbix_get -s IP -k sensor[имя чипа,имя сенсора])

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

if [[ $2 = "discovery" ]]
then
# Запуск переменной get команды sensors -u
get=`zabbix_get -s $1 -k system.run["sensors -u"]`
# Запускаем цикл в переменную чип, данные переменой выше если 2 ответ ошибка в черную дыру все | выбрать имя чипа
for chip in $(echo "${get}" 2>/dev/null|grep -E "^[^:]+$")
do
#name=`echo "${get}" | tr -d ' ' | grep -E "[:^]+$" | tr -d ':'`
#for name in ${name}; do
# чтение сенсоров получение переменной sensor
while read sensor
do
# Добавлено в цикл Соответствие к категории датчиков Юнитов Единиц измерений, получение имени
case $sensor in
temp*)
UNITS="°C"
# Вывод переменной get| удалить все пробелы| Выбрать имя чипа| Обрезать двоеточие
name=`echo "$get"|tr -d ' '|grep -E "[:^]+$"|tr -d ':'`
;;
in*)
UNITS="V"
# Вывод переменной get| удалить все пробелы| Выбрать имя чипа| Обрезать двоеточие
name=`echo "${get}" $chip | tr -d ' ' | grep -E "[:^]+$" | tr -d ':'`
;;
fan*)
UNITS="RPM"
;;
*)
UINTS=""
;;
esac
JSON=$JSON"$SEP\n{\"{#CHIP}\":\"$chip\", \"{#NAME}\":\"$name\", \"{#SENSOR}\":\"$sensor\", \"{#UNITS}\":\"$UNITS\"}"
SEP=", "
# Использование строки Here,чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) это перовое do (обрабатываем все в скобках с подстановкой из цикла) и получаем переменные вывода первого do
# Вывод переменной если ответ 2 ошибка в черную дыру все| найти строку _input: и оставить значение до ее| удалить все пробелы| -обрезать все после _
done <<<$(echo "${get}" $chip 2>/dev/null|grep -E "_input:"|tr -d " "|cut -d_ -f1)
#done|tac
#done
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp]


else
if [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in ${get}
do
echo "${out}"
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок ( в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# вырезать все до : и само :| вырезать в строке где есть + все что до + и сам + | вырезать . точку и все после нее| сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
fi
fi
Опять на команде sensors но в цикл включено соответствие для категорий
Попытка вывода data v2.8lm-sensors.sh
Показать
#!/bin/bash
# testov 2019/08/06 v2.8
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

#Автообнаружение параметров из Lm-sensor
#Ключ: discovery temp/in/fan
# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, temperature, maxtemp, info,
# $3 - Входящая переменная из команды

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

if [[ $2 = "discovery" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Запускаем цикл в переменную чип, данные переменой выше если 2 ответ ошибка в черную дыру все | выбрать имя чипа
for chip in $(echo "${get}" 2>/dev/null|grep -E "^[^:]+$")
do
# чтение сенсоров получение переменной sensor
while read spisoc
do
# Добавлено в цикл Соответствие к категории датчиков Юнитов Единиц измерений, получение имени
case $spisoc in
C*)
# Вывод переменной get| вырезать все после скобок (в том числе и саму скобку| Поиск (выбор) строк температуры °C|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| обрезать все поле двоеточия : | убрать пробелы в именах
NAMETEMP=`echo "${get}" | cut -d"(" -f1 | grep °C | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
UNITS="°C"
;;
RPM*)
NAMEFAN=`echo "${get}" | cut -d"(" -f1 | grep RPM | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
UNITS="RPM"
;;
V*)
NAMEVOLT=`echo "${get}" | cut -d"(" -f1 | grep V | awk '{print NR "" $0 }' | cut -d":" -f1 | tr -d ' '`
UNITS="V"
;;
*)
UINTS=""
;;
esac
JSON=$JSON"$SEP\n{\"{#CHIP}\":\"$chip\", \"{#NAMETEMP}\":\"$NAMETEMP\", \"{#NAMEFAN}\":\"$NAMEFAN\", \"{#NAMEVOLT}\":\"$NAMEVOLT\", \"{#UNITS}\":\"$UNITS\"}"
SEP=", "
# Использование строки Here,чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) это перовое do (обрабатываем все в скобках с подстановкой из цикла) и получаем переменные вывода первого do
# Вывод переменной если ответ 2 ошибка в черную дыру все| вырезать все после скобок ( в том числе и саму скобку| найти :| обрезать все поле двоеточия :| Удалить пробелы
done<<<$(echo "${get}" $chip 2>/dev/null| cut -d"(" -f1 | grep : | cut -d":" -f1 | tr -d ' ')
done
JSON=$JSON"\n]}"
echo -e $JSON

# Подстановка имени датчика температуры например Core0 lm-sensors.sh[{HOST.CONN},temperatyra,Core0]
# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp

else
if [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in $get
do
echo "${out}"
done
elif [[ $2 = "temperature" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors|вырезать все после скобок ( в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|вырезать все до : и само :|
# вырезать в строке где есть + все что до + и сам +| вырезать . точку и все после нее
imyatemp=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep °C | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1`
# Вывод значения переменной циклом значений температур
for out in $imyatemp
do
echo $out
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок ( в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# вырезать все до : и само :| вырезать в строке где есть + все что до + и сам + | вырезать . точку и все после нее| сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
elif [[ $2 = "fan" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors|вырезать все после скобок ( в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк Кулеров оборотов RPM|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|вырезать все до : и само :|
# вырезать в строке где есть + все что до + и сам +| вырезать R и все после нее
imyafan=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep RPM | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"R" -f1`
# Вывод значения переменной циклом значений для кулеров
for out in $imyafan
do
echo $out
done
elif [[ $2 = "volt" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors|вырезать все после скобок ( в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк Напряжения V|
# нумерация строк для присвоения номера к имени встречаются одинаковые имена| Подставляем наши имена температуры входной переменной $3 которое получили выше|вырезать все до : и само :|
# вырезать в строке где есть + все что до + и сам +| вырезать V и все после нее
imyavolt=`echo "${get}" | cut -d"(" -f1 | tr -d ' ' | grep V | awk '{print NR "" $0 }' | grep $3:| cut -d":" -f2 | cut -f 2 -d + | cut -d"V" -f1`
# Вывод значения переменной циклом значений для Напряжений
for out in $imyavolt
do
echo $out
done
fi
fi
Продолжение V2.7 V2.7.1 командой sensors -u
Скрипт версии V2.9 добавлено имена к датчикам но так же еще не решен вопрос с водом данных done<<<
Показать
#!/bin/bash
# testov 2019/08/09 v2.9
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для lm-sensors с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=52

#Автообнаружение параметров из Lm-sensor
#Ключ: discovery temp/in/fan

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

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

if [[ $2 = "discovery" ]]
then
# Запуск переменной get команды sensors -u
get=`zabbix_get -s $1 -k system.run["sensors -u"]`
# Запускаем цикл в переменную чип, данные переменой выше если 2 ответ ошибка в черную дыру все | выбрать имя чипа
for chip in $(echo "${get}" 2>/dev/null|grep -E "^[^:]+$")
do
# чтение сенсоров получение переменной sensor
while read sensor
do
# Добавлено в цикл Соответствие к категории датчиков Юнитов Единиц измерений, получение имени
case $sensor in
temp*)
# Вывод переменной get и chip| взять значение из предыдущей строки от значения $sensor | Обрезать двоеточие| удалить пробелы
NAMETEMP=`$get $chip | grep -B1 -P "$sensor"| grep -vP "$sensor"| tr -d ':'| tr -d ' '`
UNITS="°C"
;;
fan*)
NAMEFAN=`$get $chip | grep -B1 -P "$sensor"| grep -vP "$sensor"| tr -d ':'| tr -d ' '`
UNITS="RPM"
;;
in*)
NAMEVOLT=`$get $chip | grep -B1 -P "$sensor"| grep -vP "$sensor"| tr -d ':'| tr -d ' '`
UNITS="V"
;;
*)
UINTS=""
;;
esac
JSON=$JSON"$SEP\n{\"{#CHIP}\":\"$chip\", \"{#SENSOR}\":\"$sensor\", \"{#NAMETEMP}\":\"$NAMETEMP\", \"{#NAMEFAN}\":\"$NAMEFAN\", \"{#NAMEVOLT}\":\"$NAMEVOLT\", \"{#UNITS}\":\"$UNITS\"}"
SEP=", "
# Использование строки Here,чтение данных из строки, вместо всего содержимого файла (работает для bash 3+) это перовое do (обрабатываем все в скобках с подстановкой из цикла) и получаем переменные вывода первого do
# Вывод переменных get и chip если ответ 2 ошибка в черную дыру все|найти строку _input: и оставить значение до ее| удалить все пробелы| обрезать все после _
done<<<$(echo "${get}" $chip 2>/dev/null|grep -E "_input:"|tr -d " "|cut -d_ -f1)
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON

# Получение полной информации по команде sensors lm-sensors.sh[{HOST.CONN},info]
# Получение из всех доступных температур максимальной температуры lm-sensors.sh[{HOST.CONN},maxtemp

else
if [[ $2 = "info" ]]
then
# Запуск переменной get команды sensors
get=`zabbix_get -s $1 -k system.run["sensors"]`
# Вывод всего листинга команды переменой циклом
for out in $get
do
echo "${out}"
done
# Максимальная температура
elif [[ $2 = "maxtemp" ]]
then
# Запуск переменной get1 команды sensors
get1=`zabbix_get -s $1 -k system.run["sensors"]`
# Обработка вывод переменой sensors| вырезать все после скобок ( в том числе и саму скобку| убрать пробелы в именах| Поиск (выбор) строк температуры °C|
# вырезать все до : и само :| вырезать в строке где есть + все что до + и сам + | вырезать . точку и все после нее| сортировка от меньшему к большему | выбор последнего значения
maxc=`echo "${get1}" | cut -d"(" -f1 | tr -d ' ' | grep °C | cut -d":" -f2 | cut -f 2 -d + | cut -d"." -f1 | sort -nk1 | tail -n 1`
# Вывод значения переменной циклом
for out in $maxc
do
echo $out
done
fi
fi

Ответить Вложения 14

Вернуться в «Аппаратное обеспечение»