Linux风扇控制脚本

因为自己在使用的ThinkPad T440p的芯片散热实在是SB至极,为了守卫本本的安全,为了世界的和平……不说那么多了,总之为了方便,自己写了一个温控脚本,根据不同的温度来控制风扇转速。别和我说有thinkfan什么的,那玩意儿在这里不管用——它拒绝执行……不管你用什么办法,它就是拒绝的!
反正本人也懒,懒得找什么论坛解决那些奇葩的bug与设置问题,所以直接自己动手,丰衣足食,写了一个脚本。虽然不高明,但总比每次开机自己手动更改要好一些,不然一不小心电脑就煎蛋了。

所需内容


也很简单,需要:

  • 获取对风扇速度调整的权限。ThinkPad用户参考这里或者thinkwiki,稍后会介绍如何操作。
  • lm_sensors,用来读取温度
  • linux基本命令的head、sed以及awk,用于获取设备温度。
  • crontab服务以便于自动执行

思路


通过sensors检测cpu温度,根据温度的不同来向/proc/acpi/ibm/fan写入不同的级别来控制风扇转速。

echo level [1-5,7,full-speed] > /proc/acpi/ibm/fan

具体命令方式参考fan文件内容——前提是你获得了对风扇控制的权限。

然后将脚本加入到crontab任务——必须是root用户权限,每个几分钟执行一次脚本检测并调整风扇。

方法


获取对风扇速度调整的权限(以ThinkPad为例)

首先使用root用户,在 /etc/modprobe.d/ 目录下创建一个文件:

root@localhost:~ # vi /etc/modprobe.d/thinkpad_acpi.conf

内容如下:

options thinkpad_acpi experimental=1 fan_control=1

加载对风扇控制模块:

 root@localhost:~ # modprobe thinkpad_acpi fan_control=1 experimental=1

然后进入到 /proc/acpi/ibm/fan中看看是否可以更改,以本人为例,如果可以更改的话内容如下:

    status:         enabled
    speed:          3426
    level:          auto
    commands:       level  ( is 0-7, auto, disengaged, full-speed)
    commands:       enable, disable
    commands:       watchdog  ( is 0 (off), 1-120 (seconds))

当然了,不同的发行办可能有些许不同,但使一般都会提供给commands以供选择,否则您没有修改权限。

手动更改级别的话执行如下命令:

 root@localhost:~ # echo level 5 > /proc/acpi/ibm/fan

以上命令使风扇以级别5的转速运转。一般数字越大风扇速度越快。有的发行版没有级别6,而且命令模式也可能不一样。本人使用的是opensuse,命令中可以执行级别6的控制,在脚本中设置成注释,想使用的话设置好数值取消注释即可。

创建脚本,放到一个自己喜欢的地方

可能会放在你的家目录下的某一个地方,或者/etc/的某一个地方,随你喜好——只要你自己觉得合理即可。

脚本如下:

#!/bin/bash
cpu_temp=$(sensors -u|sed -n '/Core 0/ {n;p}'|awk {'print $2'}|sed 's/.000//')

#-------------configure file------------
#You can modify these arguments in this area by yourself.
#Example:  
#          lv5=45     #It means that the fan will be running at level 5 speed when CPU temperature exceeds 45 digrees Celsius.
#If the command 'sensors'  returns the value in Fahrenheit,you have to modify these arguments as Fahenheit,too.
lv1=30
lv2=35
lv3=40
lv4=42
lv5=45
#lv6=          #Setting a vaild value and deleting '#' in the relevent code snippet if you want to use level 6.
lv7=50
lv_max=70      #full speed
#--------------end of configure file--------------

change_fan_level() {
    echo level $1 > /proc/acpi/ibm/fan
}

if [ $cpu_temp -gt $lv_max ]
then
change_fan_level full-speed
elif [ $cpu_temp -gt $lv7 ] 
then 
change_fan_level 7
#Deleting '#' in the following code snippet and set a vaild value for argument lv6 if you want to use level 6.
#elif [ $cpu_temp -gt $lv6 ] 
#then                             
#change_fan_level 6               
elif [ $cpu_temp -gt $lv5 ]
then
change_fan_level 5
elif [ $cpu_temp -gt $lv4 ]
then
change_fan_level 4
elif [ $cpu_temp -gt $lv3 ]
then
change_fan_level 3
elif [ $cpu_temp -gt $lv2 ]
then
change_fan_level 2
elif [ $cpu_temp -gt $lv1 ]
then
change_fan_level 1
else
change_fan_level 1
fi

求别吐槽我的蹩脚英文和这糟糕的代码缩进风格了……谁让人家是小白~的呢。

然后赋予其可执行权限。

root@localhost:~ # chmod a+x file.sh

添加进任务列表

编辑root的crontab列表。

root@localhosts:~ # crontab -e

打开后是一个vi编辑器,添加新的一行,内容如下:

 */2 * * * * /bin/bash /shell_script_path

注意,这里脚本的路径是绝对路径。

这样便每隔2分钟便执行脚本,来修改风扇策略。

后记


还不是因为thinkfan搞不定所以才出此下策,尽量不推荐如此调教。毕竟脚本的执行能力你懂的,而且是靠crontab来实现动态检测调整的。除非实在是没有办法,否则不推荐用这个方法。
另外啊,我的sensors有些坑爹的每次重启对于温度的标识都有所改变,所以不得不直接认定Core 0核心的温度为准。通配符什么的复杂好用,一时间想不起来了,所以根据这位大触的方法来定位cpu核心0的温度。

你可能感兴趣的:(Linux风扇控制脚本)