2014-01-28 2 views
0

У меня установлены датчики lm, и мне интересно, есть ли какие-либо привязки для доступа к этим драйверам из PHP? Я хочу получить доступ к показаниям температуры на разных серверах и использовать pushover, чтобы уведомить мой iPhone, если в нескольких удаленных комнатах сервера ситуация становится слишком горячей. У меня также есть web enabled power switches, что мои серверы могут получить доступ к автоматическому отключению оборудования в чрезвычайной ситуации. У меня есть несколько других систем мониторинга, написанных в пакетном PHP, поэтому я предпочел бы, чтобы это было написано на PHP, поэтому я могу повторно использовать существующий код. Кроме того, это самый удобный для меня язык. Думаю, я мог бы использовать exec для запуска датчиков и анализа вывода, но если кто-то еще уже написал класс PHP для доступа к показаниям температуры материнской платы, я бы хотел просто использовать это, если это возможно.Как получить показания температуры материнской платы в PHP на Debian?

+0

возможно через stdin: // –

+1

Если вы используете SNMP, PHP имеет [реализацию для него] (http: //www.php .net/manual/en/book.snmp.php), что позволит решить ваши проблемы с изменением формата вывода и нескольких датчиков. Вы также можете пойти на полный пакет, такой как cacti или zabbix, определить свои пороговые значения и запустить сценарий, когда они запускаются. – Wrikken

+0

К сожалению, я ничего не знаю о SNMP, хотя я, вероятно, должен это сделать. Я также обнаружил, что на всех машинах, о которых идет речь, существуют каталоги, такие как/sys/class/therm/therm_zone0, поэтому, возможно, я могу их прочитать через мои PHP-скрипты. Могу ли я зависеть от правильности этих значений? – fastfinge

ответ

0

Решение, которое я попал собирается с было используя PHP для чтения содержимого/sys/class/therm/therm_zone0/temp через/sys/class/therm/therm_zone2/temp. В этих файлах содержится одно число, то есть температура в тысячных долях градуса. Это стандартная часть ядра Linux, и more documentation is available. Кажется, это стандартная функция ядра, поэтому она должна оставаться доступной для большинства новых Linux-систем. Он был доступен на 6 тестах.

0

не испытанный, но вы можете установить пакет как lm-sensors, а затем просто запустить команду sensors через Exec или что-то подобное и распечатать вывод

однако, безусловно, есть лучшие способы сделать это.

редактировать

Я думал, вы могли бы войти в темп процессора или что-нибудь вообще и просто прочитать файл журнала в PHP и распечатать вывод

+0

Да, я мог бы просто использовать exec, как я сказал в своем вопросе. Но это означало бы написание кода для анализа выходных сигналов датчиков и, следовательно, надежду, что он никогда не изменится. Кроме того, у меня разные машины различного количества датчиков, с разными именами датчиков, что делает вещи немного более сложными. Вот почему я надеялся, что кто-то либо написал привязки php к библиотеке lm-sensors, либо php-класс, чтобы разобрать этот вывод, который мне не нужно было бы поддерживать. – fastfinge

0

я написал парсер для вывода датчиков,

function read_sensors(): array { 
    if (0) { 
     // for debugging/testing 
     $stdout = getStdOut(); 
    } else { 
     exec ("sensors -u", $stdout, $ret); 
     if ($ret !== 0) { 
      throw new \RuntimeException ('sensors failed! returned ' . var_export ($ret, true)); 
     } 
     $stdout = implode ("\n", $stdout); 
    } 
    unset ($ret); 
    $ret = [ ]; 
    foreach (array_filter (array_map ('trim', explode ("\n\n", trim ($stdout))), 'strlen') as $sensor) { 
     // var_dump($sensor) & die(); 
     $infRaw = array_filter (array_map ('trim', explode ("\n", trim ($sensor))), 'strlen'); 
     if (count ($infRaw) < 2) { 
      throw new \LogicException ('unknown format from sensors, could not understand: ' . $sensor); 
     } 
     $name = $infRaw [0]; 
     unset ($infRaw [0]); 
     $ret [$name] = [ ]; 
     if (0 !== strlen (trim (explode (":", $infRaw [1], 2) [1]))) { 
      // some devices doesn't have a type. seen in 1/5 intel systems tested, and only on 1 device (named `Adapter: Virtual device`, not sure what it was) 
      $ret [$name] ['type'] = $infRaw [1]; 
      unset ($infRaw [1]); 
     } 
     $currentKey = NULL; 
     foreach ($infRaw as $line) { 
      $debugRawLine = $line; 
      if (false !== ($pos = strpos ($line, '_'))) { 
       $line = array_filter (array_map ('trim', explode (":", trim (substr ($line, $pos + 1)))), 'strlen'); 
       if (count ($line) !== 2) { 
        throw new \RuntimeException ('unknown format from sensors, could not understand: ' . $debugRawLine); 
       } 
       $ret [$name] [$currentKey] [$line [0]] = $line [1]; 
      } elseif (substr ($line, - 1) === ':') { 
       $line = substr ($line, 0, - 1); 
       $currentKey = $line; 
      } else { 
       throw new \LogicException ('unknown format from sensors, could not understand: ' . $debugRawLine); 
      } 
     } 
    } 
    return $ret; 
} 

и он был протестирован на 5 различных системах успешно, в том числе Debian 9, убунту 16,04, и арка (полностью обновлен 2018-01-09), и он не удался по очень старой системе amd (где формат вывода сенсоров был совершенно другим)

Смежные вопросы