Может попробовать в крон поставить, тогда как в cpu_t.log отличить кто запускал скрипт, крон или агент(если ток по времени).
Ad Widget
Collapse
Мониторинг температуры (2)
Collapse
X
-
Для дебага можно попробовать вначале выполнять sensors далее полученый результат кидать в лог, и продолжать обратывать полученый текст вашими скриптами. Думаю, этих данных с головой хватит для анализа проблемы.У себя в скрипте сделал так же как у вас:
вот что получилось, /var/log/zabbix/cpu_t.log:
20140324:090302 /etc/zabbix/script/cpu_t current => 33
20140324:090325 /etc/zabbix/script/cpu_t high => 85
................
20140325:020302 /etc/zabbix/script/cpu_t current => 39
20140325:020324 /etc/zabbix/script/cpu_t high =>
................
20140325:070326 ./cpu_t high => 85 (запуск скрипта руками)
20140325:070328 ./cpu_t high => 85 (запуск скрипта руками)
20140325:070329 ./cpu_t high => 85 (запуск скрипта руками)
20140325:080303 /etc/zabbix/script/cpu_t current => 29
20140325:080325 /etc/zabbix/script/cpu_t high =>
P.S. ну надо же, когда писал этот текст ошибочку нашел, у вас и соответственно у меня.
$(date '+%Y%m%d:%H%m%S') -- > $(date '+%Y%m%d:%H%M%S') в место минут месяц вставлялся.Comment
-
что-то типа
Code:[root@zabbix ~]# cat ./cpu_t #!/bin/bash [B]echo $(date '+%Y%m%d:%H%M%S') $0 $1 =\> `/usr/bin/sensors | grep temp` >> /var/log/zabbix/cpu_t.log [/B] v=$(/usr/bin/sensors | awk -v k=$1 ' /'temp'/ { if (k == "current") { split($2,a,".") split(a[1],b,"+") } else { if (k == "high") { split($5,a,".") split(a[1],b,"+") } } } END {print b[2]}') echo $(date '+%Y%m%d:%H%M%S') $0 $1 =\> $v >> /var/log/zabbix/cpu_t.log echo $vSincerely yours,
AlekseyComment
-
Всем привет.
Изменил скриптик с учетом ваших рекомендаций
Дополнительно, запуск скрипта добавил в крон на 30мин. каждого часа.Code:#!/bin/bash /usr/bin/sensors | awk -v tm=$(date '+%Y%m%d:%H%M%S') '/Core|CPU Temperature/ {print tm,$0}' >> /var/log/zabbix-agent/cpu_t.log t=$(/usr/bin/sensors | awk -v k=$1 '/Core|CPU Temperature/ { if (k == "current") { split($3,a,".") split(a[1],b,"+") } else { if (k == "high") { split($6,a,".") split(a[1],b,"+") } } if (maxt<b[2]) {maxt=b[2]} } END {print maxt}') echo $(date '+%Y%m%d:%H%M%S') $0 $1 =\> $t >> /var/log/zabbix-agent/cpu_t.log echo "" >> /var/log/zabbix-agent/cpu_t.log echo "$t"
Результат на всех машинах одинаков и имеет следующий вид
Code:20140401:171813 Core 0: +36.0°C (high = +76.0°C, crit = +100.0°C) 20140401:171813 Core 1: +34.0°C (high = +76.0°C, crit = +100.0°C) 20140401:171813 /etc/zabbix/script/cpu_t high => 76 ................ 20140401:175813 Core 0: +34.0 C (high = +76.0 C, crit = +100.0 C) 20140401:175813 Core 1: +32.0 C (high = +76.0 C, crit = +100.0 C) 20140401:175813 /etc/zabbix/script/cpu_t high => ................ 20140401:182812 Core 0: +35.0 C (high = +76.0 C, crit = +100.0 C) 20140401:182812 Core 1: +34.0 C (high = +76.0 C, crit = +100.0 C) 20140401:182812 /etc/zabbix/script/cpu_t high => ................ запуск по крону 20140401:183001 Core 0: +35.0°C (high = +76.0°C, crit = +100.0°C) 20140401:183001 Core 1: +35.0°C (high = +76.0°C, crit = +100.0°C) 20140401:183001 /etc/zabbix/script/cpu_t high => 76 ................ 20140401:183812 Core 0: +36.0 C (high = +76.0 C, crit = +100.0 C) 20140401:183812 Core 1: +35.0 C (high = +76.0 C, crit = +100.0 C) 20140401:183812 /etc/zabbix/script/cpu_t high => ................ 20140401:192813 Core 0: +37.0 C (high = +76.0 C, crit = +100.0 C) 20140401:192813 Core 1: +36.0 C (high = +76.0 C, crit = +100.0 C) 20140401:192813 /etc/zabbix/script/cpu_t high => ................ запуск по крону 20140401:193001 Core 0: +37.0°C (high = +76.0°C, crit = +100.0°C) 20140401:193001 Core 1: +36.0°C (high = +76.0°C, crit = +100.0°C) 20140401:193001 /etc/zabbix/script/cpu_t high => 76 ................ 20140401:193812 Core 0: +37.0 C (high = +76.0 C, crit = +100.0 C) 20140401:193812 Core 1: +36.0 C (high = +76.0 C, crit = +100.0 C) 20140401:193812 /etc/zabbix/script/cpu_t high =>
Comment
-
фантастика!
программа sensors выдает данные по разному!!!
обрати внимание, что иногда температура выводится с символом градуса °С - тогда ответ числовой (76)
20140401:171813 Core 0: +36.0°C (high = +76.0°C, crit = +100.0°C)
20140401:171813 Core 1: +34.0°C (high = +76.0°C, crit = +100.0°C)
20140401:171813 /etc/zabbix/script/cpu_t high => 76
а иногда - БЕЗ символа °С - тогда ответ пустой ()
20140401:175813 Core 0: +34.0 C (high = +76.0 C, crit = +100.0 C)
20140401:175813 Core 1: +32.0 C (high = +76.0 C, crit = +100.0 C)
20140401:175813 /etc/zabbix/script/cpu_t high =>
Это происходит потому, что в случае наличия символа °С, температура считается единым словом и скрипт выделяет правильное значение:
0 => 20140401:171813
1 => Core
2 => 0:
3 => +36.0°C
4 => (high
5 => =
6 => +76.0°C,
7 => crit
8 => =
9 => +100.0°C)
Тогда как при отсутсвии этого символа °С, температура разбивается на 2 слова (+36.0 и С) и скрипт выбирает неверное значение для Максимальной температуры. Для текущей это не имеет значения, она выбирается нормально в любом случае.
0 => 20140401:171813
1 => Core
2 => 0:
3 => +36.0
4 => C
5 => (high
6 => =
7 => +76.0
8 => C,
9 => crit
10 => =
11 => +100.0°C)
И еще один вопрос - при чем тут maxt ? Откуда он берется изначально?
Я бы его вообще убрал, он не нужен в этом скрипте. Тем более - неопределенный изначально и могущий привести к странным результатам.Sincerely yours,
AlekseyComment
-
Cнова переписал скриптик.
Теперь awk делит строку по разделителю "+" и мы получаем четыре части, из которых нам важны вторая и третья:
1 => 20140401:171813 Core 0:
2 => 36.0°C (high =
3 => 76.0°C, crit =
4 => 100.0°C)
Причем в случае вывода данных без знака °С, мы все равно получаем корректное разбиение строки
1 => 20140401:175813 Core 0:
2 => 34.0 C (high =
3 => 76.0 C, crit =
4 => 100.0 C)
Code:#!/bin/bash /usr/bin/sensors | awk -v tm=$(date '+%Y%m%d:%H%M%S') '/Core|CPU Temperature/ {print tm,$0}' >> /var/log/zabbix-agent/cpu_t.log t=$(/usr/bin/sensors | awk -F "+" -v k=$1 '/Core|CPU Temperature/ { if (k == "current") { split($2,a,".") } else { if (k == "high") { split($3,a,".") } } } END {print a[1]}') echo $(date '+%Y%m%d:%H%M%S') $0 $1 =\> $t >> /var/log/zabbix-agent/cpu_t.log echo "" >> /var/log/zabbix-agent/cpu_t.log echo "$t"Sincerely yours,
AlekseyComment
-
По разделителю полей "+" ход ясен.
Что же касается maxt, то идея была в том чтобы из всех температур(многоядерника) выбиралась максимальная.
То что maxt не определена изначально, признаю, с моей стороны это халатность.
Всем тем кто откликнулся огромнейшее СПАСИБО!!!
Уважаемый aib !!!! аплодирую стоя
Last edited by mda.kem; 04-04-2014, 07:00.Comment
-
У меня есть еще пару вопросов возможно не по теме.
1. Как будет правильней? Использовать скрипт для получения данных(вроде того, что мы рассматривали выше)
и запрашивать его на исполнение с сервера посредством ключа -или же вставлять его в пользовательский параметр на стороне агентаCode:system.run[/etc/zabbix/script/cpu_t high,wait]
ну или такCode:UserParameter=cpu_current, sensors | awk -v maxt=0 -F "+" '/Core|CPU Temperature/ {split($2,a,"."); if (maxt<a[1]) {maxt=a[1]}}; END {print maxt}' UserParameter=cpu_high, sensors | awk -F "+" '/Core|CPU Temperature/ {split($3,a,".")}; END {print a[1]}'
2. В каких случаях использовать активный проверки а в каких пассивные в отношении ПК.Code:UserParameter=cpu_t[*],sensors | awk -v k=$1 -v maxt=0 -F "+" '/Core|CPU Temperature/ {if(k=="current") {split($2,a,".")} else {if(k=="high") {split($3,a,".")}}; if(maxt<a[1]) {maxt=a[1]}}; END {print maxt}'Comment
-
Не обязательно локаль. Еще может зависить от того, куда именно мы пишем: на стандартный вывод или на вход другой программе:
Code:yukra@yukra-ThinkPad ~/SOAP $ ls request.soap s.sh yukra@yukra-ThinkPad ~/SOAP $ ls | cat request.soap s.sh
Comment
-
1. - UserParameter. Этот вариант не заставляет вас включать удаленное выполнение команд (кто-то получает доступ к вашему zabbix серверу. Если UserParameter то он все видит, но ничего сделать не может, если system.run, то он получает доступ к хостам с правами пользователя, от которого запущен агент.
2. Пассивные: сервер ходит к агенту. Активные: агент приходит к серверу, получает список нужных проверок и по своей инициативе пуляет их в сторону сервера.
Если у нас ПК - пользовательские машины (выключаются на ночь, могут 2 недели не использоваться потому что человек в отпуске и тп) то я бы выбрал активные (что бы сервер лишний раз не ходил к выключенным машинам).Comment
-
Ну.... подведем итоги.
Проблема при которой перестает выводится значение границы высокой температуры найдена, обход этой проблемы внедрен(6 дней полет нормальный), вопросов больше нет... пока... так что тему можно закрывать.
P.s. Еще раз всех благодарю за участие.
Comment
Comment