在 Linux 系统中,有的时候我们需要根据实际需要调节风扇转速,特别是私人存储服务的场景中,要保证硬盘正常运行的同时,有效降低噪音并节约能源要兼顾安静又需要兼顾硬盘散热,。 在现有的工具中,已经有fancontrol、HDDFanControl可以控制风扇转速,后者可以直接根据硬盘温度调节特定风扇。已经很方便了。 但是我是用的存储系统是OpenMediaVault,不知道为什么我安装的HDDFanControl就不起作用,明明也能识别到风扇。试了很多种方法还是不行,因此有了本篇文章这种另辟蹊径的方法:通过脚本来控制。 ## 一、所需应用及工具 1. **sensors** :用于获取硬件传感器数据,包括硬盘温度等。 2. **bc** :命令行计算器,用于进行浮点数比较。 3. **cron** :用于定时执行脚本。 ## 二、脚本编写 ```bash #!/bin/bash # 定义温度阈值(摄氏度) TEMP_THRESHOLD=42 # 定义风扇控制文件路径 FAN_CONTROL_PATH="/sys/devices/platform/nct6775.656/hwmon/hwmon5/pwm4" # 定义日志文件路径 LOG_FILE="/var/log/temperature_monitor.log" # 函数:获取所有drivetemp-scsi的温度 get_scsi_temps() { sensors | grep "drivetemp-scsi" -A 2 | grep "temp1:" | awk '{print $2}' | tr -d '+°C' } # 主逻辑 get_scsi_temps >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') - Failed to get temperature data." >> "$LOG_FILE" exit 1 fi TEMPS=$(get_scsi_temps) OVER_THRESHOLD="0" for temp in $TEMPS; do if (( $(echo "$temp > $TEMP_THRESHOLD" | bc -l) )); then OVER_THRESHOLD="1" break fi done if [ "$OVER_THRESHOLD" = "1" ]; then echo "180" > "$FAN_CONTROL_PATH" echo "$(date +'%Y-%m-%d %H:%M:%S') - Temperature over threshold ($TEMP_THRESHOLD°C). Setting fan speed to 180." >> "$LOG_FILE" else echo "0" > "$FAN_CONTROL_PATH" echo "$(date +'%Y-%m-%d %H:%M:%S') - All temperatures below threshold ($TEMP_THRESHOLD°C). Setting fan speed to 0." >> "$LOG_FILE" fi ``` ## 三、脚本说明 1. 脚本首先定义了温度阈值、风扇控制文件路径和日志文件路径。 2. `get_scsi_temps` 函数用于获取所有 `drivetemp-scsi` 设备的温度。 3. 主逻辑部分检查每个温度是否超过阈值,根据检查结果设置风扇速度并记录日志。 ## 四、使用 cron 定时执行脚本 1. 编辑 `crontab`: ```bash crontab -e ``` 2. 添加以下行来每 5 分钟运行一次脚本: ```bash */5 * * * * /bin/bash /root/monitor_temps.sh ``` ## 五、总结 通过上述步骤,我们成功实现了根据硬盘温度动态调整风扇转速的功能。这有助于在保证硬盘正常运行的同时,降低噪音并节约能源。在实际应用中,你可以根据需要调整温度阈值、风扇控制文件路径等参数,以适应不同的系统环境。 Loading... 在 Linux 系统中,有的时候我们需要根据实际需要调节风扇转速,特别是私人存储服务的场景中,要保证硬盘正常运行的同时,有效降低噪音并节约能源要兼顾安静又需要兼顾硬盘散热,。 在现有的工具中,已经有fancontrol、HDDFanControl可以控制风扇转速,后者可以直接根据硬盘温度调节特定风扇。已经很方便了。 但是我是用的存储系统是OpenMediaVault,不知道为什么我安装的HDDFanControl就不起作用,明明也能识别到风扇。试了很多种方法还是不行,因此有了本篇文章这种另辟蹊径的方法:通过脚本来控制。 ## 一、所需应用及工具 1. **sensors** :用于获取硬件传感器数据,包括硬盘温度等。 2. **bc** :命令行计算器,用于进行浮点数比较。 3. **cron** :用于定时执行脚本。 ## 二、脚本编写 ```bash #!/bin/bash # 定义温度阈值(摄氏度) TEMP_THRESHOLD=42 # 定义风扇控制文件路径 FAN_CONTROL_PATH="/sys/devices/platform/nct6775.656/hwmon/hwmon5/pwm4" # 定义日志文件路径 LOG_FILE="/var/log/temperature_monitor.log" # 函数:获取所有drivetemp-scsi的温度 get_scsi_temps() { sensors | grep "drivetemp-scsi" -A 2 | grep "temp1:" | awk '{print $2}' | tr -d '+°C' } # 主逻辑 get_scsi_temps >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') - Failed to get temperature data." >> "$LOG_FILE" exit 1 fi TEMPS=$(get_scsi_temps) OVER_THRESHOLD="0" for temp in $TEMPS; do if (( $(echo "$temp > $TEMP_THRESHOLD" | bc -l) )); then OVER_THRESHOLD="1" break fi done if [ "$OVER_THRESHOLD" = "1" ]; then echo "180" > "$FAN_CONTROL_PATH" echo "$(date +'%Y-%m-%d %H:%M:%S') - Temperature over threshold ($TEMP_THRESHOLD°C). Setting fan speed to 180." >> "$LOG_FILE" else echo "0" > "$FAN_CONTROL_PATH" echo "$(date +'%Y-%m-%d %H:%M:%S') - All temperatures below threshold ($TEMP_THRESHOLD°C). Setting fan speed to 0." >> "$LOG_FILE" fi ``` ## 三、脚本说明 1. 脚本首先定义了温度阈值、风扇控制文件路径和日志文件路径。 2. `get_scsi_temps` 函数用于获取所有 `drivetemp-scsi` 设备的温度。 3. 主逻辑部分检查每个温度是否超过阈值,根据检查结果设置风扇速度并记录日志。 ## 四、使用 cron 定时执行脚本 1. 编辑 `crontab`: ```bash crontab -e ``` 2. 添加以下行来每 5 分钟运行一次脚本: ```bash */5 * * * * /bin/bash /root/monitor_temps.sh ``` ## 五、总结 通过上述步骤,我们成功实现了根据硬盘温度动态调整风扇转速的功能。这有助于在保证硬盘正常运行的同时,降低噪音并节约能源。在实际应用中,你可以根据需要调整温度阈值、风扇控制文件路径等参数,以适应不同的系统环境。 最后修改:2025 年 07 月 03 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏