nafanja |
|
Темы:
94
Сообщения:
9252
Участник с: 02 июня 2012
заблокирован
|
Была такая проблема, при большой нагрузке на проц (компиляция ядра и т.п.) он начинал перегреваться. Температура зашкаливала за критическую и комп вырубался. Решил проблему небольшим скриптом, который по крону каждые 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 # температура процессора при которой переключается частота на остывание # 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 |
Natrio |
|
Темы:
47
Сообщения:
4763
Участник с: 08 января 2011
|
Ох… Я, конечно, и сам люблю писать скрипты, но по-моему, в данном конкретном случае, проблема явно “железная” – скорей всего кулер не справляется со своей работой – неподходящий, износился, забился пылью, плохо прилегает, закупорен в корпусе и т.д. Ну, или как вариант, на материнке может глючить микросхема мониторинга датчиков, и выдавать неправильную температуру – мне и такое попадалось. В норме процессор НИКОГДА НЕ ДОЛЖЕН перегреваться до срабатывания защиты, хоть ты ему запусти CPUBurn и оставь жариться на неопределённое время. Процессор физически невозможно загрузить больше, чем 100% от своих вычислительных ресурсов, а система охлаждения должна штатно обеспечивать приемлемую температуру именно при полной загрузке процессора. |
nafanja |
|
Темы:
94
Сообщения:
9252
Участник с: 02 июня 2012
заблокирован
|
Natrioviewtopic.php?f=19&t=9680&start=30#p86746 NatrioДа может, и глючит… но нести в ремонт из за такой мелочи которую я программно починил, как то не охота… Гарантия закончилась несколько лет назад ))) Думаю скрипт может кому пригодится, с подобной проблемой…
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874 |
sleepycat |
|
Темы:
98
Сообщения:
3291
Участник с: 19 июля 2011
|
# устанавливаем переменные если они не определены #[ ! "$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 Тоже если честно, не спал бы , даже если програмно решено. Чай не разгон вроде…
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
|
nafanja |
|
Темы:
94
Сообщения:
9252
Участник с: 02 июня 2012
заблокирован
|
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 |
sleepycat |
|
Темы:
98
Сообщения:
3291
Участник с: 19 июля 2011
|
┌─[ Пт. сент. 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
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
|
nafanja |
|
Темы:
94
Сообщения:
9252
Участник с: 02 июня 2012
заблокирован
|
#!/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 |
sleepycat |
|
Темы:
98
Сообщения:
3291
Участник с: 19 июля 2011
|
не знаю, весь год работала такая конструкция. Если переменная не задана, то ей присваевается значение по умолчанию, если значение есть, то оно остается неизменным, не знаю, оставляй как есть, я просто показал как я делаю, строк меньше выходит.┌─[ Пт. сент. 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
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
|
Natrio |
|
Темы:
47
Сообщения:
4763
Участник с: 08 января 2011
|
nafanja, всё гораздо проще :) Для арифметических сравнений (код возврата зависит от истинности или ложности) надо использовать двойные круглые скобки и обыкновенный арифметический Си-синтаксис, например так: ((TEMP1>TEMP2)) && echo больше echo $((A+B*C)) let A=B+2 ((i++)) ((i+=2)) А вот конструкцию от sleepycat я упорно не понимаю. Что это вообще было? |
sleepycat |
|
Темы:
98
Сообщения:
3291
Участник с: 19 июля 2011
|
средство объявления переменной с встроенной проверкой существования онной, подсмотрел в учебнике. Зачем лишние ифы вставлять , когда можно прямо в теле функции уже все прописать? поставьте фигурные скобки и будет счастье ;) Скопировал метод в скрипте, но только разменял условия(sensors) и действия(я до утра буду ждать перегрева ;] ), а структуру оставил туже, что и в примере, все работает, не знаю что там у вас не показывает. А вот этого я упорно не понимаю.
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
|