
Предисловие
Для 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 утилита предустановлена):

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

С извлечением данных о температуре диска было сложнее. Можно использовать 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.
Был вариант:

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

Нет нужной мне информации.
Из 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)

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

JBFW
03.11.2025 14:10Смотря какая цель. Если график за день-месяц-год составить - прекрасно подходит, если узнать, сколько точно было 18 марта 2024 года в 17:34 - то уже не очень..
alexs963
Sudo можно настроить чтобы определённые команды выполнялись без запроса пароля.
ky0
Про это в следующей статье будет. /s