Задачка на смекалку
2011-10-03 16:16Серверу под FreeBSD 8 нужно отдавать температуру CPU в градусах цельсия через SNMP. Команда sysctl -n dev.cpu.0.temperature
#!/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%%.*}
no subject
Date: 2011-10-03 09:28 (UTC)no subject
Date: 2011-10-03 09:34 (UTC)no subject
Date: 2011-10-03 09:44 (UTC)no subject
Date: 2011-10-03 09:45 (UTC)См. обновление поста.
no subject
Date: 2011-10-03 09:28 (UTC)no subject
Date: 2011-10-03 09:44 (UTC)no subject
Date: 2011-10-03 09:54 (UTC)no subject
Date: 2011-10-26 21:38 (UTC)