Уголок СУ-11 на просторах вселенной

вторник, 24 февраля 2009 г.

скрипт для управления кулером

автор не я, просто подумал что может комуто пригодится
В /usr/sbin/ есть консольный fancontrol. Должен быть установлен lm_sensors.
Он как раз и управляет вентиляторами в зависимости от температуры.

По этому принципу сделал свой скрипт для регулировки процессорного вентилятора:

#!/usr/bin/perl

# Файл значения оборотов вентилятора
$CpuFanFile="/sys/class/hwmon/hwmon0/device/fan1_input";
# Файл разрешения управлением вентилятором
$CpuFanFileEnable="/sys/class/hwmon/hwmon0/device/pwm1_enable";
# Файл задания оборотов вентилятора
$CpuFanSetFile="/sys/class/hwmon/hwmon0/device/pwm1";
# Файл значения температуры
$CpuTempFile="/sys/class/hwmon/hwmon0/device/temp2_input";
# Верхняя граница установки оборотов
$CpuSetMax=255;
# Нижняя граница установки оборотов
$CpuSetMin=110;
# Верхняя граница температуры
$CpuTempMax=70;
# Нижняя граница температуры
$CpuTempMin=45;
# Предыдущее значение температуры
$TempPrev=0;

# Включение управления вентилятором
open (CpuFanEnF , ">>".$CpuFanFileEnable) or die "Ошибка записи в файл $CpuFanFileEnable: $!\n";
print CpuFanEnF "1";
close CpuFanEnF;

while (1<2){

# Получение значения оборотов
sysopen (CpuFanF, $CpuFanFile, O_RDONLY);
$CpuFan=;
close (CpuFanF);
# Получение значения температуры
sysopen (CpuTempF, $CpuTempFile, O_RDONLY);
$CpuTemp=;
$CpuTemp=$CpuTemp / 1000;
close (CpuTempF);

if ($TempPrev == 0) {$TempPrev=$CpuTemp;}
$DeltaTemp=abs ($CpuTemp-$TempPrev);
if ($DeltaTemp>0){
# Вычисление
$CpuFanRange=$CpuSetMax-$CpuSetMin;
$CpuTempRange=$CpuTempMax-$CpuTempMin;
$CpuKoeff=$CpuFanRange / $CpuTempRange;
$CpuDeltaTemp=$CpuTemp-$CpuTempMin;
$CpuFanDeltaSet=$CpuDeltaTemp * $CpuKoeff;
$CpuFanSet=$CpuFanDeltaSet+$CpuSetMin;

# Проверка выхода из диапазона
if ($CpuFanSet<$CpuSetMin) {$CpuFanSet=$CpuSetMin;}
if ($CpuFanSet>$CpuSetMax) {$CpuFanSet=$CpuSetMax;}

# Установка оборотов (запись в файл)
open (CpuFanSetF , ">>".$CpuFanSetFile);
print CpuFanSetF $CpuFanSet;
close CpuFanSetF;

$FanPercent=int ($CpuFanSet / 2.55);
# print ("Изменение температуры с $TempPrev°C на $CpuTemp°C. Обороты установлены на $FanPercent%\n");
$TempPrev=$CpuTemp;
}

sleep 1;
}

Запускаю его из /etc/rc.d/rc.local

Комментариев нет: