Файл журнала температуры
Файл журнала температуры

Предисловие

Для Windows имеется немало программ, в том числе и бесплатных, для просмотра температуры ЦП, накопителя, а также для записи в файл: SpeedFan, Crystal Disk Info (2), Libre Hardware Monitor, HWMonitor, HWiNFO и тому подобные.

Для Linux также имеются похожие программы (Psensor (использует hddtemp, libatasmart, udisks2 (в моём случае udisks2), lm-sensors, XNVCtrl, ATI ADL SDK), gkrellm, inxi, но было интересно самому написать сценарий для записи температуры в текстовый файл.

Используется ноутбук ACER Extensa, ОС: LMDE6.

Сценарий №1

Требуется: температура ЦП, температура накопителя, запись данных в .txt.

Температура ЦП определяется посредством sensors (в LMDE6 утилита предустановлена):

 sensors
sensors

Отсюда требуется лишь температура ядер:

 sensors | grep 'Core' | cut -c -23
sensors | grep 'Core' | cut -c -23

С извлечением данных о температуре диска было сложнее. Можно использовать smartctl:

sudo smartctl -a /dev/sda | grep "Temperature"
[sudo] пароль:             
194 Temperature_Celsius     0x0022   100   100   000    Old_age   Always       -       32 (Min/Max 20/45)

Не смог найти утилиты без использования sudo.

Был вариант:

 cat /sys/class/hwmon/hwmon*/name
cat /sys/class/hwmon/hwmon*/name

Должен (вроде как) отображаться "drivetemp" ( grep -l "drivetemp" /sys/class/hwmon/hwmon*/name ), но нет.

Либо:

 cat /proc/diskstats
cat /proc/diskstats

Нет нужной мне информации.

Из udisksctl не нашёл как извлечь температуру.

Утилиты hddtemp нет в репозиториях LMDE6. На github: hddtemp-master.zip 6,8 KB.

Извлечь и поместить 'hddtemp-lt' в папку '/usr/local/bin/' (требуются права root).

sudo hddtemp-lt
[sudo] пароль:             
/dev/sda  TOSHIBA MQ01ABD100  32
/dev/sdb  NA                  NA
/dev/sdc  NA                  NA

Примечание. Определяет только внутренний накопитель, внешние — нет.

sudo -S hddtemp-lt --classic /dev/sd* | grep "TOSHIBA"
/dev/sda: TOSHIBA MQ01ABD100: 32°C

Примечание. Использовал маску /dev/sd*, поскольку при подключении внешних дисков до запуска системы внутренний накопитель может назначаться как /dev/sdb, а не как /dev/sda.

Итоговый сценарий (№1):

#!/bin/bash
# Сценарий записи температуры ядер центрального процессора посредством sensors и внутреннего накопителя посредством hddtemp-lt 
# Объявление переменных: пути к файлам. 
tmp_log="$HOME/Log/temper-log"
 
if [ ! -d "$HOME/Log" ]
then
mkdir $HOME/Log
fi

# Функция Temperature: запись температуры ядер центрального процессора (sensors) и внутреннего накопителя посредством (hddtemp-lt) (запись в файл каждые три минуты). 
function Temperature () {
echo -e "\n\t\t$(date '+%F') $(uptime)" >> $tmp_log
sensors | grep 'Core' | cut -c -23 >> $tmp_log

printf "пароль" | sudo -S hddtemp-lt --classic /dev/sd* | grep "TOSHIBA" >> $tmp_log
            }
            
while :
do
Temperature
sleep 180
done

Примечание. 1. Не самая хорошая идея втыкать пароль прямо в сценарий, но для домашнего использования сойдёт. 2. Пришлось слепить функцию, поскольку не смог сделать всё из одних if’ов.

Сценарий №2

Текущие температуры не особо интересны, если они не критические. Поэтому вариант №2 — запись в файл температур, превышающих заданные пределы. ЦП в используемом ноутбуке достаточно холодный, как и HDD TOSHIBA, поэтому для ЦП выставил предел в +65°C, для диска — в +39°C.

#!/bin/bash
# Сценарий записи критических температур ядер центрального процессора посредством sensors и внутреннего накопителя посредством hddtemp-lt 
# Объявление переменных: пути к файлам. 
warning_log="$HOME/Log/warning_log"
 
if [ ! -d "$HOME/Log" ]
then
mkdir $HOME/Log
fi

# Функция HDD_Temperature_Warning: запись критической температуры внутреннего накопителя. 
# Объявление локальных переменных: критическая температура накопителя. 
function HDD_Temperature_Warning () {
    
local hdd_temp_fact="$(printf "пароль" | sudo -S hddtemp-lt --classic /dev/sd* | grep "TOSHIBA" | cut -c 11-35)"
local hdd_temp_max="TOSHIBA MQ01ABD100: 39°C"

if [ "$hdd_temp_fact" \> "$hdd_temp_max" ]
then
echo -e "$(date '+%F %T') $hdd_temp_fact" >> $warning_log
fi
    }

# Функция CPU_Temperature_Warning: запись критической температуры ядер центрального процессора. 
# Объявление локальных переменных: критические температуры ядер центрального процессора. 
function CPU_Temperature_Warning () {
    
local cpu_temp_fact_0="$(sensors | grep 'Core 0' | cut -c -23 )"
local cpu_temp_max_0="Core 0:       +65.0°C "
local cpu_temp_fact_2="$(sensors | grep 'Core 2' | cut -c -23 )"
local cpu_temp_max_2="Core 2:       +65.0°C "

if [ "$cpu_temp_fact_0" \> "$cpu_temp_max_0" ]
then
echo -e "$(date '+%F %T') $cpu_temp_fact_0" >> $warning_log
fi

if [ "$cpu_temp_fact_2" \> "$cpu_temp_max_2" ]
then
echo -e "$(date '+%F %T') $cpu_temp_fact_2" >> $warning_log
fi
    }
    
# Цикл записи в temper_warning-log. 
while :
do
HDD_Temperature_Warning
CPU_Temperature_Warning
sleep 60
done

Раз в минуту проверяется температура, если значение равно или выше заданного, пишется в файл.

Комментарии (4)


  1. alexs963
    03.11.2025 14:10

    Sudo можно настроить чтобы определённые команды выполнялись без запроса пароля.


    1. ky0
      03.11.2025 14:10

      Про это в следующей статье будет. /s


  1. foxb
    03.11.2025 14:10

    https://ru.wikipedia.org/wiki/RRDtool может быть использован для лучшего использования пространства вместо обычного текстового файла.


    1. JBFW
      03.11.2025 14:10

      Смотря какая цель. Если график за день-месяц-год составить - прекрасно подходит, если узнать, сколько точно было 18 марта 2024 года в 17:34 - то уже не очень..