Задачка на смекалку
2011-10-03 16:16![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Серверу под 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%%.*}