В этой статье мы будем решать аппаратные проблемы программными средствами с привлечением человеческого ресурса.
Итак, проблема. Через год использования видеокарточки, кулер перестал самостоятельно раскручиваться. Пылью забился или еще что. Прочистки хватило на месяц, после чего та же проблема. После пяти минут работы компьютера чипсет на видеокарте разогревается, и карточка отключается (где-то на 200°C).
Найти подходящий кулер с нужной посадкой никак не могу, ну а пока поиски продолжаются, нужно как-то работать. А начиная работать, постоянно забываешь проверить кулер, и через пять минут работы, чертыхаясь, приходится перезагружаться.
Итак, нужна программа-следилка за температурой ядра видеокарточки. Программа должна при увеличении температуры выше нормы напоминать пользователю о том, что неплохо бы подтолкнуть кулер пальцем, чтоб он таки начал вращаться. Вот как это сделать за несколько минут в Linux.
Во-первых, надо выяснить, каким образом можно получить текущую температуру ядра видюшки. У меня карточка NVidia, и для нее существует программа nvidia-settings. Она может работать как в графическом, так и в консольном режиме. Используя следующие опции, можно вывести в консоль текущую температуру:
$ nvidia-settings --ctrl-display=:0 -q GPUCoreTemp
В ответ программа выведет примерно следующее:
Attribute 'GPUCoreTemp' (pangolinux:0.0): 43.
'GPUCoreTemp' is an integer attribute.
'GPUCoreTemp' is a read-only attribute.
'GPUCoreTemp' can use the following target types: X Screen, GPU.
Число 43 - это и есть температура в градусах Цельсия. Отфильтруем вывод так, чтоб видеть только температуру:
$ nvidia-settings --ctrl-display=:0 -q GPUCoreTemp | grep Attribute | awk '{print $4}' | sed 's/\.//'
В ответ увидим число 43. Этого нам достаточно, чтобы организовать сравнение с нужным нам числом.
Во-вторых, нужно решить, как выводить сообщение о разогреве на экран. Я пользуюсь для таких вещей программой zenity. Zenity - это набор простейших экранных утилит для взаимодействия с пользователем. В наборе Zenity есть стандартное окно-уведомление, мы им и будем пользоваться.
Делаем следующий bash-скрипт (назовем его gputemp.sh):
#!/bin/sh
# Для отладки
echo "Gputemp run" >> /tmp/gputemp.log
# Заппрос температуры
temperature=`nvidia-settings --ctrl-display=:0 -q GPUCoreTemp | grep Attribute | awk '{print $4}' | sed 's/\.//'`
# Проверка температуры
if test ${temperature} -gt 64
then
# Получаем номера активных дисплеев.
# Это нужно, чтобы сообщение открывалось не только
# на дисплее :0, но и на других дисплеях,
# если в системе одновременно открыто
# несколько сессий с разными пользователями
disp=`ps -ef | awk '$8 ~ /X$/ {print $9}'`
# Перебираются дисплеи
for n in $disp
do
export DISPLAY=${n}
zenity --info --title="Warning" --text="Ядро видеокарты слишком горячее. Текущая температура ${temperature} C. Проверьте, включен ли кулер." &
done
fi
Проверяем его следующим образом. В коде скрипта задаем температуру срабатывания ниже текущей. При запуске скрипта должно появиться предупреждающее сообщение. После чего в коде ставим нужную нам пороговую температуру срабатывания.
Данный скрипт помещаем куда-нибудь в /opt или в /usr/bin, и прописываем его запуск раз в минуту в Cron. Для этого из-под рута даем команду:
# crontab -e
Откроется редактор, в котором нужно добавить строку:
* * * * * /usr/bin/gputemp.sh
По-идее все должно работать, но есть один подводный камушек, поэтому нам не обойтись без теста. Вначале прописываем в наш скрипт пониженный порог срабатывания и ждем, появится ли сообщение-предупреждение. Если через минуту не появилось, значит что-то пошло не так. Надо разбираться.
Удалим файл /tmp/gputemp.log, и если через минуту он не создался, значит что-то не так с Cron. Если же файл создался, но сообщения не появилось, значит X-сервер блокирует вывод окошек-сообщений от рута. Есть такая особенность у X-сервера, что он выводит окошки только те, которые создаются текущим пользователем. Чтобы это исправить, нужно после старта X-сервера автоматически выполнить команду:
$ xhost +local:
Для систем Ubuntu и Debian размещать команду xhost +local: нужно в файле /etc/profile. Команды из этого файла выполняются после того, как произошел логин пользователя в оконную систему (справедливо для KDE, GNOME, на других DE не проверялось). По неизвестным причинам, файл /etc/X11/xinit/xinitrc, который специально предназначен для выполнения команд в момент входа в DE, в системах Ubuntu и Debian не работает.
После таких настроек уведомление о перегреве микросхемы GPU должно появляться в красивом окошечке, которое нарисует нам Zenity. Увидев его, мы лезем под стол, толкаем кулер, чтоб он начал крутиться. И не забываем дать себе обещание, что завтра, непременно, пойдем в во-он тот магазин, и купим, наконец, нужный кулер.