Сделал 2 варианта шаблонов через команду sensors и через команду sensors -u
Тут можно почитать О программе LM-Sensors Дополнительные опции, как работает, скачать. Загляните посмотрите!
Установка
Устанавливаем на удаленный Хост программу 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 только добавлено отдельно обнаружение и обработка других параметров Напряжения и кулерров
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
далее определяете железо как описано выше
hddtemp - инструмент для измерения температуры жестких дисков;
psensor - графическая утилита для мониторинга температуры, которая позволяет посмотреть температуру linux, для процессора, видеокарты, жестких дисков и других компонентов, которые поддерживают эту функцию.
Иногда, когда не все датчики доступны, то может помочь параметр:
acpi_enforce_resources=lax
Он прописывается, как дополнительный в загрузчик Grub. Делается это в файле etc/default/grub в таком виде:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_enforce_resources=lax"
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
А так же вариант с напряжениям и кулерами плюс строка с отдельными скобками
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:~#
Вывод скрипта 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:~#
Обратный запрос значения происходит командами через скрипт от 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:~#
Запрос значения напрямую минуя скрипт
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
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
специальный оператор перенаправления << и идентификатор-разделитель
знак минуса к оператору перенаправления <<- приведет к игнорированию всех начальных символов табуляции. Это позволяет использовать отступы при написании здесь документов в сценариях оболочки. Не допускаются начальные пробельные символы, только табуляция.
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
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 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"}]}
Можно использовать которые с +
Скрипты на команде 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 - Решена проблема дублей (добавлено входящие данные в скрипт для внешней проверки)
#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
Отличие от предыдущих скриптов в V2.6 том что поиск разделен на категории Температура, Кулера, Напряжение, так же разделено и входящие ключи по категориям.
# 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
Первый скрипт V1.0 - поиск датчиков температуры
# 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
так же улучшена обработка с минусовой температурой в значение попадает не название датчика а целое значение минусовой температуры. (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)
# 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