Скрипт контроля температуры CPU

Была такая проблема, при большой нагрузке на проц (компиляция ядра и т.п.) он начинал перегреваться. Температура зашкаливала за критическую и комп вырубался.
Решил проблему небольшим скриптом, который по крону каждые 30 сек проверяет температуру проца и если она становится выше высокой снижает частоту процессора, а как проц охлаждается, то обратно поднимает до максимальной.
/usr/local/bin/cpu-temperature-save сделать исполняемым!
#!/bin/bash
#
#   cpu-temperature-save
#
#   Copyright (c) 2012 ArchAnTavr <archlinux@antavr.ru>;
#   http://archlinux.antavr.ru
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>;.
#
# зависит от пакетов
# bash grep sed gawk coreutils cpupower lm_sensors
#
# добавить в cron
# -*/1 * * * * /usr/local/bin/cpu-temperature-save; /usr/bin/sleep 30; /usr/local/bin/cpu-temperature-save
# конфиг файл cpu-temperature-save
# /usr/local/etc/conf.d/cpu-temperature-save
## период выполнения скрипта 30 сек
## время остывания в секундах, кратно выполнению скрипта
##FRTIME=100 (не используется!!!)
# температура процессора при которой переключается частота на остывание
# sensors | grep 'CPU Temperature'
# по умолчанию: высокая температура
#TEMPERATURE_SAVE=60
# частота процессора при остывании
# cpupower frequency-info | grep 'available frequency steps'
# по умолчанию: минимальная частота
# для максимальной производительности, опытным путем выбрать
# максмальную частоту при которой процессор не греется
#FREQUENCY_SAVE='1800M'
# конкц конфиг файл cpu-temperature-save
source /usr/local/etc/conf.d/cpu-temperature-save
LOCKF='/var/lock/cpu-temperature-save.lock'
LOGF='/var/log/cpu-temperature-save.log'
# заполняем переменные из вывода сенсоров
# TEMPERATURE - текущая температура процессора
# TEMPERATURE_HIGH - высокая температура процессора
# TEMPERATURE_CRIT - критическая температура процессора
eval $(sensors \
  | grep 'CPU Temperature' \
  | cut -d " " -f5- \
  | sed 's/.0°C//g;s/.0 C//g;s/[\+,\(\)]//g;s/  / /g;s/^ /TEMPERATURE=/g;s/high = /; TEMPERATURE_HIGH=/g;s/crit = /; TEMPERATURE_CRIT=/g')
# заполняем переменные из вывода информации о возможных частотах процессора
# FREQUENCY_MAX - максимальная частота процессора
# FREQUENCY_MIN - минимальная частота процессора
eval $(cpupower frequency-info \
  | grep 'available frequency steps' \
  | cut -d " " -f6- \
  | sed 's/ //g' \
  | awk -F ',' '{print "FREQUENCY_MAX="$1"; FREQUENCY_MIN="$NF}')
# устанавливаем переменные если они не определены
[ ! "$TEMPERATURE_SAVE" ] && TEMPERATURE_SAVE=$TEMPERATURE_HIGH
[ ! "$FREQUENCY_SAVE" ] && FREQUENCY_SAVE=$FREQUENCY_MIN
# если текущая температура процессора выше высокой,
# то снижаем частоту процессора
# в противном случае повышаем
if [[ $TEMPERATURE -gt $TEMPERATURE_SAVE ]]
then
# если частота процессора не была снижена
  if [ ! -f "$LOCKF" ]
  then
    touch "$LOCKF"
    cpupower frequency-set -u "$FREQUENCY_SAVE"
    echo "$(date) cpupower frequency-set -u $FREQUENCY_SAVE TEMPERATURE = $TEMPERATURE" >> "$LOGF"
  fi
else
# если частота процессора была снижена
  if [ -f "$LOCKF" ]
  then
#  && [[ $(expr $(stat -c %Y "$LOCKF") + $FRTIME) -lt $(date +%s)  ]]
    cpupower frequency-set -u "$FREQUENCY_MAX"
    echo "$(date) cpupower frequency-set -u $FREQUENCY_MAX" >> "$LOGF"
    rm -f "$LOCKF"
  fi
fi
/usr/local/etc/conf.d/cpu-temperature-save конфиг
# температура процессора при которой переключается частота на остывание
# sensors | grep 'CPU Temperature'
# по умолчанию: высокая температура
#TEMPERATURE_SAVE=60
# частота процессора при остывании
# cpupower frequency-info | grep 'available frequency steps'
# по умолчанию: минимальная частота
# для максимальной производительности, опытным путем выбрать
# максмальную частоту при которой процессор не греется
#FREQUENCY_SAVE='1800M'

Ну и добавить запуск по крону для root
-*/1 * * * * /usr/local/bin/cpu-temperature-save; /usr/bin/sleep 30; /usr/local/bin/cpu-temperature-save
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
Ох…
Я, конечно, и сам люблю писать скрипты, но по-моему, в данном конкретном случае, проблема явно “железная” – скорей всего кулер не справляется со своей работой – неподходящий, износился, забился пылью, плохо прилегает, закупорен в корпусе и т.д.
Ну, или как вариант, на материнке может глючить микросхема мониторинга датчиков, и выдавать неправильную температуру – мне и такое попадалось.

В норме процессор НИКОГДА НЕ ДОЛЖЕН перегреваться до срабатывания защиты, хоть ты ему запусти CPUBurn и оставь жариться на неопределённое время. Процессор физически невозможно загрузить больше, чем 100% от своих вычислительных ресурсов, а система охлаждения должна штатно обеспечивать приемлемую температуру именно при полной загрузке процессора.
Natrio
Я, конечно, и сам люблю писать скрипты, но по-моему, в данном конкретном случае, проблема явно “железная” – скорей всего кулер не справляется со своей работой – неподходящий, износился, забился пылью, плохо прилегает, закупорен в корпусе и т.д.
viewtopic.php?f=19&t=9680&start=30#p86746

Natrio
Ну, или как вариант, на материнке может глючить
Да может, и глючит… но нести в ремонт из за такой мелочи которую я программно починил, как то не охота…
Гарантия закончилась несколько лет назад )))

Думаю скрипт может кому пригодится, с подобной проблемой…
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
# устанавливаем переменные если они не определены
#[ ! "$TEMPERATURE_SAVE" ] && TEMPERATURE_SAVE=$TEMPERATURE_HIGH
#[ ! "$FREQUENCY_SAVE" ] && FREQUENCY_SAVE=$FREQUENCY_MIN
# если текущая температура процессора выше высокой,
# то снижаем частоту процессора
# в противном случае повышаем
if [[ $TEMPERATURE > ${TEMPERATURE_SAVE=$TEMPERATURE_HIGH} ]]
then
# если частота процессора не была снижена
  if [ ! -f "$LOCKF" ]
  then
    touch "$LOCKF"
    cpupower frequency-set -u "${FREQUENCY_SAVE=$FREQUENCY_MIN}"
    echo "$(date) cpupower frequency-set -u ${FREQUENCY_SAVE=$FREQUENCY_MIN} TEMPERATURE = $TEMPERATURE" >> "$LOGF"
  fi
else
а так работает?
PS
Тоже если честно, не спал бы , даже если програмно решено. Чай не разгон вроде…
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
if [[ $TEMPERATURE > ${TEMPERATURE_SAVE=$TEMPERATURE_HIGH} ]]
${FREQUENCY_SAVE=$FREQUENCY_MIN}
Зачем это???

TEMPERATURE_SAVE и FREQUENCY_SAVE могут настраиваться в конфиге и им присваивается значение только если оно не указано, а тут эти значения будут всегда равны TEMPERATURE_HIGH и FREQUENCY_MIN
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> ${temp=ls}
abs		 data.txt   echat.log  media	 playlists    snap_-_i_got_the_power_original_version_(zaycev.net).mp3	Videos
arch-flash.odt	 default    foo.wav    mnt	 Podcasts     snap_-_i_got_the_power_original_version_(zaycev.net).rar	VirtualBox VMs
backups		 Desktop    FreeLords  Music	 Public       snes							vmware
build		 docs	    games      MuttMail  script       test.txt							weather
chess		 Documents  gtk-3.0    mymisc	 scripts      tildabak							ZombieGrinder
cockatrice	 Downloads  mail       Pictures  session.vim  tmp							Рабочий стол
console_log.txt  Dropbox    Mail       pkgbld	 smb	      triplea
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> temp='uname -a'
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> ${temp=ls}
Linux jinnlamp 3.5.3-1-ARCH #1 SMP PREEMPT Sun Aug 26 08:15:06 UTC 2012 i686 GNU/Linux
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
#!/bin/bash
TEMP=10
echo "(TEMP1=TEMP) = $(TEMP1=$TEMP)" # выведет ли оно "10"???
# а ничего не вывело
echo "TEMP1 = $TEMP1"
# тоже ничего, не определена переменная
echo "TEMP = $TEMP"
# и так вывело 10
# а теперь определим и установим переменную TEMP1
TEMP1=20
echo "(TEMP1=TEMP) = $(TEMP1=$TEMP)" # выведет ли оно теперь хоть что нибудь???
# опять ничего не вывело
echo "TEMP1 = $TEMP1"
# вывело "20" так как уже определена
# уничтожим переменную
unset TEMP1
echo "TEMP1 = $TEMP1"
# ничего не вывело
TEMP2=1
# проверим сработает эта конструкция, TEMP у нас 10 так и осталась
if [[ $TEMP2 -gt "$(TEMP1=$TEMP)" ]]
then
  echo 'Ok1'
fi
# вывело "Ok1"
# хотя 1>10=false
# проверим сработает ли если использовать вместо -gt знак ">"
if [[ $TEMP2 > $(TEMP1=$TEMP) ]]
then
  echo 'Ok2'
fi
# аналогично вывело "Ok2"
# хотя 1>10=false
# а все по тому что $(TEMP1=$TEMP) равно пустоте!!!
TEMP1=20
if [[ $TEMP2 -gt $(TEMP1=$TEMP) ]]
then
  echo 'Ok3'
fi
# и так вывело "Ok3"!!!
# хотя 1>20=false
# а все по тому что $(TEMP1=$TEMP) равно пустоте!!!
if [[ $TEMP2 -gt $TEMP ]]
then
  echo 'Ok4'
fi
if [[ $TEMP2 -gt $TEMP1 ]]
then
  echo 'Ok5'
fi
# а так ничего не вывело, потому что все правильно сработало!!!

Из этого видно что конструкции
echo “(TEMP1=TEMP) = $(TEMP1=$TEMP)”
и
if [] или if []
не рабочие!!!

Хотя благодарю, нашел ошибку нужно вместо знака > использовать -gt
Исправил…


Ты сам запутался в той конструкции что привел, потому что она имеет не однозначное толкование.
Я бы написал бы так
TEMP='ls'
$TEMP
TEMP='uname -a'
$TEMP
[ ! "$TEMP" ] && TEMP='ls'
$TEMP

Пусть длиннее, но зато однозначно и понятно трактуется.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
не знаю, весь год работала такая конструкция. Если переменная не задана, то ей присваевается значение по умолчанию, если значение есть, то оно остается неизменным, не знаю, оставляй как есть, я просто показал как я делаю, строк меньше выходит.
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> TEMP=10
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> echo ${TEMP1=TEMP}
TEMP
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> echo ${TEMP1=$TEMP}
TEMP
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> TEMP=0
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> echo ${TEMP1=$TEMP}
TEMP
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> echo ${TEMP2=$TEMP}
0
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> TEMP2='i am TEMP2'
┌─[ Пт. сент. 28 ] :: [jinn] - [jinnlamp] :: [~]
└─>> echo ${TEMP2=$TEMP}
i am TEMP2
наверно опять я туплю…под ночь то X-((
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
nafanja, всё гораздо проще :)
Для арифметических сравнений (код возврата зависит от истинности или ложности) надо использовать двойные круглые скобки и обыкновенный арифметический Си-синтаксис, например так:
((TEMP1>TEMP2)) && echo больше
Для подстановки арифметический выражений – те же двойные круглые, только со знаком $ в начале:
echo $((A+B*C))
Для присваиваний можно использовать также двойные круглые или let:
let A=B+2
((i++))
((i+=2))
Во всех арифметических варажениях знак $ перед переменными ставить МОЖНО, но не обязательно. Исключение – номерные (позиционные) переменные, которые $1 $2 и т.д., там без знака никак.

А вот конструкцию от sleepycat я упорно не понимаю. Что это вообще было?
средство объявления переменной с встроенной проверкой существования онной, подсмотрел в учебнике. Зачем лишние ифы вставлять , когда можно прямо в теле функции уже все прописать?
поставьте фигурные скобки и будет счастье ;) Скопировал метод в скрипте, но только разменял условия(sensors) и действия(я до утра буду ждать перегрева ;] ), а структуру оставил туже, что и в примере, все работает, не знаю что там у вас не показывает. А вот этого я упорно не понимаю.
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
 
Зарегистрироваться или войдите чтобы оставить сообщение.