Премини към съдържанието

Препоръчан отговор


Отдавна не съм се занимавал с това, та ще се допитам до някои от знаещите тук, дали следния шел скрипт ще работи правилно, или ще трябва да променя нещо по него?

 

#!/bin/bash

# Активиране на ръчен режим
echo 1 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable
# Задаване на 75% скорост
#echo 200 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1

# Извличане на информация за температура
gputemperature=`cat /sys/class/drm/card0/device/hwmon/hwmon2/temp1_input`
#eval $temperature
#echo $gputemperature

# Задаване на скорост в зависимост от температурата
if ["$gputemperature" -gt 40000 ]
then echo 70 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
fi

if [ "$gputemperature" -gt 50000 ]
then echo 90 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
fi

if [ "$gputemperature" -gt 60000 ]
then echo 135 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
fi

if [ "$gputemperature" -gt 65000 ]
then echo 155 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
fi

if [ "$gputemperature" -gt 70000 ]
then echo 175 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
fi

if [ "$gputemperature" -gt 75000 ]
then echo 200 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
fi

if [ "$gputemperature" -gt 80000 ]
then echo 220 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
fi

if [ "$gputemperature" -gt 85000 ]
then echo 240 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
fi

if [ "$gputemperature" -gt 90000 ]
then echo 255 > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1

 

Това е конкретната част която ме интересува дали има нужда от някаква допълнителна промяна.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

публикувано (редактирано)
преди 28 минути, Росен Р. Александров написа:

Отдавна не съм се занимавал с това, та ще се допитам до някои от знаещите тук, дали следния шел скрипт ще работи правилно, или ще трябва да променя нещо по него?

Това е конкретната част която ме интересува дали има нужда от някаква допълнителна промяна.

Никога не съм ползвал, но бих обмислил следните неща:

1. Колко често се изпълнява скрипта, защото нещо трябва да го повтаря в разумни граници. Ако не го повтаря ще трябва безкраен цикъл със sleep вътре.

2. Ще се изпълнят много if случаи и извиквания echo - това от една страна бави, но по-важното подаваш грашни стойности на системата, преди да решиш окончателно. По-скоро трябва в if- овете да решиш каква стойност ще извеждаш и накрая да обновиш с echo, ако е различна от предишната.

3. Май има по-хитра формула за управление на охлаждането.

https://youtu.be/oJ32CMxliCQ?t=9m12s

 

Редактирано от Melmak ® (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 7 минути, bvbfan написа:

Не

Да, има нужда от корекции. Като начало първия if ще даде грешка

преди 7 минути, Росен Р. Александров написа:

какво не?

Росене, логиката, която ползваш не е много добра, опитай да оптимизираш проверките


  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

На мен ми трябва за контрол на видеокартата, тъй като автоматичния режим не прави нищо, и винаги стои на 30% дори и при голямо натоварване.

преди 5 минути, capnemo написа:

Да, има нужда от корекции. Като начало първия if ще даде грешка

Росене, логиката, която ползваш не е много добра, опитай да оптимизираш проверките

За това казах че отварям тема, защото малко не мога да се ориентирам след толкова време.

Значи целта е, да се прави справка от файла за температурата на видеокартата, след което при различно зададени стойности от файл температура, да задава определена скорост на вентилатора. Не знам дали се изразих достатъчно ясно за намеренията ми.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 17 минути, Росен Р. Александров написа:

На мен ми трябва за контрол на видеокартата, тъй като автоматичния режим не прави нищо, и винаги стои на 30% дори и при голямо натоварване.

За това казах че отварям тема, защото малко не мога да се ориентирам след толкова време.

Значи целта е, да се прави справка от файла за температурата на видеокартата, след което при различно зададени стойности от файл температура, да задава определена скорост на вентилатора. Не знам дали се изразих достатъчно ясно за намеренията ми.

Защо не зададеш границите и стойността на pwn1 във файл и не проверяваш от там? Така ще можеш по-лесно да дефинираш горна и долна граница. Примерно

40000 50000 70
50000 60000 90

И да правиш нещо такова:

GTEMP=$(cat /sys/class/drm/card0/device/hwmon/hwmon2/temp1_input)
while read LOWER UPPER VALUE
do
if [ "$GTEMP" -ge "$LOWER " &&  "$GTEMP" -lt "$UPPER " ]
then echo $VALUE > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
break
done <inputfile

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 6 минути, capnemo написа:

Защо не зададеш границите и стойността на pwn1 във файл и не проверяваш от там? Така ще можеш по-лесно да дефинираш горна и долна граница. Примерно


40000 50000 70
50000 60000 90

И да правиш нещо такова:


GTEMP=$(cat /sys/class/drm/card0/device/hwmon/hwmon2/temp1_input)
while read LOWER UPPER VALUE
do
if [ "$GTEMP" -ge "$LOWER " &&  "$GTEMP" -lt "$UPPER " ]
then echo $VALUE > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
break
done <inputfile

 

По този начин се очаква скрипта да е постоянно активен и да следи за промени, и да се активизира. 

Оказва се че може да бъде много по-просто от това което съм направил аз.

ПС: Как точно ще стане дефинирането на стойностите в променлива? Ако е примерно...

 

LOWER="40000 50000 70" 

Това нещо ще разбере ли че става дума за диапазона между 40 и 50 градуса и да зададе стойност на вентилатора 70 ?

Редактирано от Росен Р. Александров (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 5 минути, Росен Р. Александров написа:

По този начин се очаква скрипта да е постоянно активен и да следи за промени, и да се активизира. 

Оказва се че може да бъде много по-просто от това което съм направил аз.

Дали ще е постоянно пуснат или ще го пускаш с крон всяка минута няма голямо значение (освен това че в крон не можеш да пускаш по-често от всяка минута, докато в демонизиран шел можеш да имаш забавяне от секунда и ще избегнеш теоретическа възможност да бъдат стартирани повече от едно копия)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 5 минути, capnemo написа:

Дали ще е постоянно пуснат или ще го пускаш с крон всяка минута няма голямо значение (освен това че в крон не можеш да пускаш по-често от всяка минута, докато в демонизиран шел можеш да имаш забавяне от секунда и ще избегнеш теоретическа възможност да бъдат стартирани повече от едно копия)

Ще трябва да се стартира като демон, трябва постоянно да следи, кронтаб през минута може да доведе до прегряване при натоварване, докато се стартира отново.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 4 минути, Росен Р. Александров написа:

Ще трябва да се стартира като демон, трябва постоянно да следи, кронтаб през минута може да доведе до прегряване при натоварване, докато се стартира отново.

Тогава трябва да вземеш специални мерки за пренасочване на STDIN, STDOUT и STDERR в някакъв лог (последните две) за да можеш да следиш при нужда какво става. Както и да го откачиш от терминала за да не спре при затваряне на терминала.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Абе това done <inputfile дава грешка в кода?

 

синтактична грешка в близост до неочакваната лексема „done“ Или <inputfile не е част от този код.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 4 минути, Росен Р. Александров написа:

Абе това done <inputfile дава грешка в кода?

 

синтактична грешка в близост до неочакваната лексема „done“ Или <inputfile не е част от този код.

Това е файла в който са стойностите: долна граница, горна граница, стойност. И е само промерно име

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 7 минути, Росен Р. Александров написа:

Нещо не се получава.

Винаги дава грешка в синтаксиса около done

Нещо си объркал в синтаксиса:

[2017-05-26 09:52.02]  ~/tmp
[NR2] ➤ cat q
40000 50000 70
50000 60000 90

[2017-05-26 09:52.06]  ~/tmp
[NR2] ➤ while read A B C; do echo $A $B $C; done<q
40000 50000 70
50000 60000 90

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами взех това което си дал в поста.

while read A B C; do echo $A %B %C; done<test
40000 %B %C
50000 %B %C
 

Да не би да има разлики в версиите на баш ? При мен не се показва като при теб

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
преди 1 час, Росен Р. Александров написа:

На мен ми трябва за контрол на видеокартата, тъй като автоматичния режим не прави нищо, и винаги стои на 30% дори и при голямо натоварване.

За това казах че отварям тема, защото малко не мога да се ориентирам след толкова време.

Значи целта е, да се прави справка от файла за температурата на видеокартата, след което при различно зададени стойности от файл температура, да задава определена скорост на вентилатора. Не знам дали се изразих достатъчно ясно за намеренията ми.

Това го разбрахме, но както си го направил може да възникнат осцилации около някоя граница. Тоест вентилатора да увеличава и след това намалява ход постоянно. Разбира се шанса за този дефект е малък. Също правилно си се ориентирал, че цикъл е много по-добре, отколкото последователни извиквания. Само сложи инструкция в края на цикъла да чака за 1200 милисекунди, примерно. Иначе може дори да почне да натоварва системата, знаеш компютрите са много вманиачени в скоростта на повтаряне, ако не се сетиш да ги ограничиш.

https://www.cyberciti.biz/faq/linux-unix-sleep-bash-scripting/

преди 1 час, capnemo написа:

Дали ще е постоянно пуснат или ще го пускаш с крон всяка минута няма голямо значение (освен това че в крон не можеш да пускаш по-често от всяка минута, докато в демонизиран шел можеш да имаш забавяне от секунда и ще избегнеш теоретическа възможност да бъдат стартирани повече от едно копия)

Не съм съгласен. Много е по-добре да си го управлява изцяло от скрипта, тъкмо и конфигурацията ще е на едно място, а не на две или повече. И по-надеждно, понеже скрипта е винаги зареден от началото, докато ако системата сбъга не се знае дали ще може да зареди още една програма. Естествено би било странно да се случи, но все пак.

Редактирано от Melmak ® (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 7 минути, Melmak ® написа:

.....

Не съм съгласен. Много е по-добре да си го управлява изцяло от скрипта, тъкмо и конфигурацията ще е на едно място, а не на две или повече. И по-надеждно, понеже скрипта е винаги зареден от началото, докато ако системата сбъга не се знае дали ще може да зареди още една програма. Естествено би било странно да се случи, но все пак.

Точно това (скрипта да се зарежда с инит) на мен лично хич не ми харесва, защото това може да има много неприятни последици за производителността. А и дебъгването на подобен скрипт си е предизвикателство. Да не говорим че да се направи добър SYS V скрипт, който да работи коректно не е упражнение за 5 минути

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Все още не мога да го докарам до работещ вид... Заради грешка в синтаксиса, която не знам от къде идва. 

Всичко изглежда изрядно.

 

#!/bin/bash

# Активиране на ръчен режим
echo 1 | sudo tee /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable

GTEMP=$(cat /sys/class/drm/card0/device/hwmon/hwmon2/temp1_input)
file="gpufanspeed"
while read -r LOWER UPPER VALUE;
do
if [ "$GTEMP" -ge "$LOWER " ; "$GTEMP" -lt "$UPPER " ]
then
echo "$VALUE" | sudo tee /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
break
done <"$file"

Аз ли пропускам нещо?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 5 минути, capnemo написа:

Точно това (скрипта да се зарежда с инит) на мен лично хич не ми харесва, защото това може да има много неприятни последици за производителността. А и дебъгването на подобен скрипт си е предизвикателство. Да не говорим че да се направи добър SYS V скрипт, който да работи коректно не е упражнение за 5 минути

Съгласен. Хубавото е че може да го извика през systemd, което решава много проблеми. Между другото аз бих го написал на C, което донякъде решава някои проблеми с дебъгването и не е обвързано с BASH.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 4 минути, Росен Р. Александров написа:

Все още не мога да го докарам до работещ вид... Заради грешка в синтаксиса, която не знам от къде идва. 

Всичко изглежда изрядно.

 


#!/bin/bash

# Активиране на ръчен режим
echo 1 | sudo tee /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable

GTEMP=$(cat /sys/class/drm/card0/device/hwmon/hwmon2/temp1_input)
file="gpufanspeed"
while read -r LOWER UPPER VALUE;
do
if [ "$GTEMP" -ge "$LOWER " ; "$GTEMP" -lt "$UPPER " ]
then
echo "$VALUE" | sudo tee /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
break
done <"$file"

Аз ли пропускам нещо?

Росене, какъв е този IF? Я виж какво съм написал по-горе!

П.П. И какви са тези спейсове след имената на променливите (преди кавичките)?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами така си ги написал, така съм ги копирал, това е най-малкия проблем, но мисля че видях къде е пропуска.

Аз копирах твоят код, без дори да погледна, че си забравил да сложиш fi

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 5 минути, Росен Р. Александров написа:

Ами така си ги написал, така съм ги копирал, това е най-малкия проблем, но мисля че видях къде е пропуска.

Аз копирах твоят код, без дори да погледна, че си забравил да сложиш fi

fi трябва да е след break

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

сега друга дивотия се получи.

 

./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 5 минути, Росен Р. Александров написа:

сега друга дивотия се получи.

 

./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
./radeon-fan.sh: ред 10: [: липсва „]“
 

Дай пак скрипта, защото не знаем кой е този ред номер 10

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.