Сообщить об ошибке.

Информация с датчиков сервера, модуль psutil в Python

Материал содержит описание функций модуля psutil с примерами, которые считывают и возвращают информацию с датчиков сервера, таких как температура оборудования (процессор, HDD и т.д.), скорость вентиляторов, статус и заряд батареи.

Содержание:


psutil.sensors_temperatures(fahrenheit=False):

Функция psutil.sensors_temperatures() возвращает показания температуры оборудования. Каждая запись - это именованный кортеж, представляющий определенный аппаратный датчик температуры (это может быть процессор, жесткий диск или что-то еще, в зависимости от ОС и ее конфигурации).

Все температуры выражаются в градусах Цельсия, если для аргумента fahrenheit не установлено значение True. Если датчики не поддерживаются ОС, возвращается пустой словарь.

Пример использования psutil.sensors_temperatures():

>>> import psutil
>>> psutil.sensors_temperatures()
# {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],
#  'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],
#  'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),
#               shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0),
#               shwtemp(label='Core 1', current=52.0, high=100.0, critical=100.0),
#               shwtemp(label='Core 2', current=45.0, high=100.0, critical=100.0),
#               shwtemp(label='Core 3', current=47.0, high=100.0, critical=100.0)]}

Доступность: Linux, FreeBSD

psutil.sensors_fans():

Функция psutil.sensors_fans() возвращает скорость аппаратных вентиляторов. Каждая запись представляет собой именованный кортеж, представляющий определенный вентилятор аппаратного датчика.

Скорость вентилятора выражается в RPM (оборотов в минуту). Если датчики не поддерживаются ОС, возвращается пустой словарь.

Пример использования psutil.sensors_fans():

>>> import psutil
>>> psutil.sensors_fans()
# {'asus': [sfan(label='cpu_fan', current=3200)]}

Доступность: Linux

psutil.sensors_battery():

Функция psutil.sensors_battery() возвращает информацию о состоянии батареи в виде именованного кортежа, включая следующие значения. Если батарея не установлена ​​или метрики не могут быть определены, возвращается None.

  • percent: battery power left as a percentage.
  • secsleft: a rough approximation of how many seconds are left before the battery runs out of power. If the AC power cable is connected this is set to -psutil.POWERTIMEUNLIMITED. If it can’t be determined it is set to psutil.POWERTIMEUNKNOWN.
  • `power_plugged: True if the AC power cable is connected, False if not or None if it can’t be determined.

Пример использования psutil.sensors_battery():

>>> import psutil
>>> def secs2hours(secs):
...     mm, ss = divmod(secs, 60)
...     hh, mm = divmod(mm, 60)
...     return "%d:%02d:%02d" % (hh, mm, ss)

>>> battery = psutil.sensors_battery()
>>> battery
# sbattery(percent=93, secsleft=16628, power_plugged=False)
>>> print("charge = %s%%, time left = %s" % (battery.percent, secs2hours(battery.secsleft)))
# charge = 93%, time left = 4:37:08

Доступность: Linux, Windows, FreeBSD

Пример измерения температуры оборудования.

Пример представляет простенький сценарий для измерения температуры оборудования в Linux.

import sys
import psutil

def main():
    if not hasattr(psutil, "sensors_temperatures"):
        sys.exit("платформа не поддерживается")
    temps = psutil.sensors_temperatures()
    if not temps:
        sys.exit("не могу определить никакую температуру")
    for name, entries in temps.items():
        print(name)
        for entry in entries:
            print("    %-20s %s °C (high = %s °C, critical = %s °C)" % (
                entry.label or name, entry.current, entry.high,
                entry.critical))
        print()

if __name__ == '__main__':
    main()

Вывод сценария:

$ python3 test.py
asus
    asus                 47.0 °C (high = None °C, critical = None °C)
acpitz
    acpitz               47.0 °C (high = 103.0 °C, critical = 103.0 °C)
coretemp
    Physical id 0        54.0 °C (high = 100.0 °C, critical = 100.0 °C)
    Core 0               47.0 °C (high = 100.0 °C, critical = 100.0 °C)
    Core 1               48.0 °C (high = 100.0 °C, critical = 100.0 °C)
    Core 2               47.0 °C (high = 100.0 °C, critical = 100.0 °C)
    Core 3               54.0 °C (high = 100.0 °C, critical = 100.0 °C)

Пример извлечения скорости вентиляторов и информации о батарее.

Этот пример представляет собой клон утилиты "sensors" для измерения температуры оборудования в Linux, скорости вентиляторов и извлечения информации о батарее.

import psutil

def secs2hours(secs):
    mm, ss = divmod(secs, 60)
    hh, mm = divmod(mm, 60)
    return "%d:%02d:%02d" % (hh, mm, ss)

def main():
    if hasattr(psutil, "sensors_temperatures"):
        temps = psutil.sensors_temperatures()
    else:
        temps = {}
    if hasattr(psutil, "sensors_fans"):
        fans = psutil.sensors_fans()
    else:
        fans = {}
    if hasattr(psutil, "sensors_battery"):
        battery = psutil.sensors_battery()
    else:
        battery = None

    if not any((temps, fans, battery)):
        print("не удается прочитать информацию "
              "о температуре, вентиляторах или батарее")
        return

    names = set(list(temps.keys()) + list(fans.keys()))
    for name in names:
        print(name)
        # температура.
        if name in temps:
            print("    Temperatures:")
            for entry in temps[name]:
                print("        %-20s %s°C (high=%s°C, critical=%s°C)" % (
                    entry.label or name, entry.current, entry.high,
                    entry.critical))
        # вентиляторы.
        if name in fans:
            print("    Fans:")
            for entry in fans[name]:
                print("        %-20s %s RPM" % (
                    entry.label or name, entry.current))

    # батарея.
    if battery:
        print("Battery:")
        print("    charge:     %s%%" % round(battery.percent, 2))
        if battery.power_plugged:
            print("    status:     %s" % (
                "charging" if battery.percent < 100 else "fully charged"))
            print("    plugged in: yes")
        else:
            print("    left:       %s" % secs2hours(battery.secsleft))
            print("    status:     %s" % "discharging")
            print("    plugged in: no")


if __name__ == '__main__':
    main()

Вывод сценария:

$ python3 test.py
asus
    Temperatures:
        asus                 57.0°C (high=None°C, critical=None°C)
    Fans:
        cpu_fan              3500 RPM
acpitz
    Temperatures:
        acpitz               57.0°C (high=108.0°C, critical=108.0°C)
coretemp
    Temperatures:
        Physical id 0        61.0°C (high=87.0°C, critical=105.0°C)
        Core 0               61.0°C (high=87.0°C, critical=105.0°C)
        Core 1               59.0°C (high=87.0°C, critical=105.0°C)
Battery:
    charge:     84.95%
    status:     charging
    plugged in: yes