美文网首页
Linux风扇控制脚本

Linux风扇控制脚本

作者: Sinatori | 来源:发表于2017-08-14 11:25 被阅读0次

    因为自己在使用的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 <level> (<level> is 0-7, auto, disengaged, full-speed)
        commands:       enable, disable
        commands:       watchdog <timeout> (<timeout> 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风扇控制脚本

          本文链接:https://www.haomeiwen.com/subject/xcbyrxtx.html