dadv: (stopstupid)
[personal profile] dadv

Серверу под FreeBSD 8 нужно отдавать температуру CPU в градусах цельсия через SNMP. Команда sysctl -n dev.cpu.0.temperature выдаёт температуру с десятичными долями и буквой C в конце, для отдачи по SNMP в виде INTEGER будем по-простому отрезать разделитель и всё, что после него:

#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin

cput="`sysctl -n dev.cpu.0.temperature`"
echo ${cput%%,*}

Запускаем вручную, проверяем, что выдаёт. Настраиваем bsnmpd с использованием его плагина bsnmp-ucd, чтобы вызывал наш скрипт и его вывод отдавал в виде OID внутри ветки enterprise - всё работает. Рисуем график через mrtg - рисуется.

Так работает несколько дней, после перезагрузки сервера график рисоваться перестаёт. Проверяем, запуская скрипт вручную - температуру показывает. Через SNMP данные не передаются, хотя до ребута передавались. Другие подобные OID, получаемые через запуск внешних скриптов из bsnmp-ucd, по-прежнему исправно отдаются.

Внимание, вопрос - что это было? Ответ напишу через пару дней, если никто не догадается.

Update: как быстро указали в комментах, sysctl использует текущую локаль для выдачи разделителя целой и дробной части числа. После настройки bsnmpd требуется его перезапуск, чтобы привести в действие изменения его конфигурации и при перезапуске он унаследовал текущую локаль, в которой разделитель - запятая. После перезагрузки bsnmpd был запущен с локалью "C", в которой разделитель - точка. Отсечение разделителя с символами после него сломалось, строка в целое число больше не конвертируется, целое число по SNMP не передаётся.

Правильное решение - сделать скрипт независимым от локали, которая была ему передана путем явного переопределения локали в "C" и замены разделителя на точку:

#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin
export LC_ALL=C
cput="`sysctl -n dev.cpu.0.temperature`"
echo ${cput%%.*}

Date: 2011-10-03 09:28 (UTC)
From: [identity profile] neveripe.livejournal.com
Именно поэтому я все /usr/local/etc/rc.d/ и /etc/rc.d запускаю после 'su -', а не из-под sudo.

Date: 2011-10-03 09:34 (UTC)
From: [identity profile] dmarck.livejournal.com
А я LC_NUMERIC=C и LC_DATE=C ставлю ;-P

Date: 2011-10-03 09:44 (UTC)
From: [identity profile] dadv.livejournal.com
Угу. Обновил пост.

Date: 2011-10-03 09:45 (UTC)
From: [identity profile] dadv.livejournal.com
Правильней писать скрипт так, чтобы он работал независимо от способа его запуска :-)
См. обновление поста.

Date: 2011-10-03 09:28 (UTC)
From: [identity profile] gelraen.myopenid.com (from livejournal.com)
Разделитель же от локали зависит.

Date: 2011-10-03 09:44 (UTC)
From: [identity profile] dadv.livejournal.com
Какие все умные, куда деваться :-)

Date: 2011-10-03 09:54 (UTC)
From: [identity profile] gelraen (from livejournal.com)
это не "все умные", это "у всех лбы граблями побитые"

Date: 2011-10-26 21:38 (UTC)

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Tags

Style Credit

Powered by Dreamwidth Studios