# 看注释和实际使用情况,鄙人水平不行,有问题别问更别请教,我不配!
# 咸鱼淘宝卖码屎全家,欢迎转载仅需注明本文出处即可,互相尊重有惊喜。
使用前在飞牛应用商店安装ite-it87驱动
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 |
#!/bin/bash # 海康R1智能风扇控制中心 v1.1 - 优化版本 By zhangzsky # 手动三档,自动模式,开机自动智能温控 # 用法:sudo ./R1_fan_control.sh # ========================= 基础配置 ========================= VERSION="1.1" SERVICE_NAME="r1-smart-fan" SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" SCRIPT_PATH="/usr/local/bin/r1_fan_control.sh" # 硬件路径定义 readonly PWM_CPU="/sys/class/hwmon/hwmon3/pwm3" readonly PWM_HDD="/sys/class/hwmon/hwmon3/pwm2" readonly PWM_CPU_ENABLE="/sys/class/hwmon/hwmon3/pwm3_enable" readonly PWM_HDD_ENABLE="/sys/class/hwmon/hwmon3/pwm2_enable" readonly RPM_CPU="/sys/class/hwmon/hwmon3/fan3_input" readonly RPM_HDD="/sys/class/hwmon/hwmon3/fan2_input" # 温度传感器路径 readonly TEMP_CPU="/sys/class/hwmon/hwmon2/temp1_input" readonly TEMP_MB1="/sys/class/hwmon/hwmon3/temp1_input" readonly TEMP_MB2="/sys/class/hwmon/hwmon3/temp2_input" readonly TEMP_MB3="/sys/class/hwmon/hwmon3/temp3_input" # 运行参数 readonly PWM_MAX=255 AUTO_CHECK_INTERVAL=5 # 手动模式预设值 [CPU风扇, 硬盘风扇] declare -A MANUAL_PRESETS=( ["静音"]="80 60" ["适中"]="120 100" ["积极"]="180 150" ) # 颜色定义(美化显示) RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # ========================= 工具函数 ========================= print_header() { clear echo -e "${BLUE}========================================${NC}" echo -e "${GREEN} HIKASEMI R1 智能风扇控制中心 v${VERSION}${NC}" echo -e "${BLUE}========================================${NC}\n" } print_success() { echo -e "${GREEN}✓ $1${NC}"; } print_warning() { echo -e "${YELLOW}⚠ $1${NC}"; } print_error() { echo -e "${RED}✗ $1${NC}"; } print_info() { echo -e "${CYAN}➜ $1${NC}"; } # ========================= 硬件检测 ========================= check_hardware() { # 验证PWM控制文件是否存在 for file in "$PWM_CPU" "$PWM_HDD"; do [[ ! -f "$file" ]] && { print_error "硬件文件缺失: $file"; return 1; } done print_success "硬件检测通过" return 0 } # ========================= 温度读取 ========================= read_temp_c() { local temp_raw=$(cat "$1" 2>/dev/null) [[ -n "$temp_raw" ]] && echo $((temp_raw/1000)) || echo "--" } # 检测所有存储设备 detect_disk_devices() { local disk_list=() # SATA设备 for disk in /dev/sd[a-z]; do [[ -b "$disk" ]] && disk_list+=("$(basename "$disk")"); done # NVMe设备 for disk in /dev/nvme[0-9]n[0-9]; do [[ -b "$disk" ]] && disk_list+=("$(basename "$disk")"); done echo "${disk_list[@]}" } # 获取指定磁盘温度 get_disk_temp() { local disk_name="$1" temp="--" # SATA硬盘检测 if [[ "$disk_name" =~ ^sd[a-z]$ ]]; then local temp_paths=( "/sys/block/${disk_name}/device/hwmon/hwmon*/temp1_input" "/sys/block/${disk_name}/device/hwmon*/temp1_input" ) for temp_path in "${temp_paths[@]}"; do local temp_files=($(ls $temp_path 2>/dev/null)) for temp_file in "${temp_files[@]}"; do [[ -r "$temp_file" ]] && { local temp_raw=$(cat "$temp_file" 2>/dev/null | head -1) [[ -n "$temp_raw" ]] && { temp=$((temp_raw/1000)); echo "$temp"; return 0; } } done done # 备用方案:smartctl command -v smartctl &>/dev/null && { local smart_temp=$(smartctl -A "/dev/${disk_name}" 2>/dev/null | grep -i "temperature" | head -1 | awk '{print $10}') [[ -n "$smart_temp" ]] && echo "$smart_temp" && return 0 } fi # NVMe硬盘检测 if [[ "$disk_name" =~ ^nvme[0-9]n[0-9]$ ]]; then local temp_paths=( "/sys/block/${disk_name}/device/hwmon/hwmon*/temp1_input" "/sys/class/nvme/${disk_name:0:5}/device/hwmon/hwmon*/temp1_input" ) for temp_path in "${temp_paths[@]}"; do local temp_files=($(ls $temp_path 2>/dev/null)) for temp_file in "${temp_files[@]}"; do [[ -r "$temp_file" ]] && { local temp_raw=$(cat "$temp_file" 2>/dev/null | head -1) [[ -n "$temp_raw" ]] && { temp=$((temp_raw/1000)); echo "$temp"; return 0; } } done done # 备用方案:nvme-cli command -v nvme &>/dev/null && { local nvme_temp=$(nvme smart-log "/dev/${disk_name}" 2>/dev/null | grep "temperature" | awk '{print $3}') [[ -n "$nvme_temp" ]] && echo "$nvme_temp" && return 0 } fi echo "--" } # ========================= 系统状态显示 ========================= show_system_status() { # 读取系统温度 local cpu_temp=$(read_temp_c "$TEMP_CPU") local mb_temp1=$(read_temp_c "$TEMP_MB1") local mb_temp2=$(read_temp_c "$TEMP_MB2") local mb_temp3=$(read_temp_c "$TEMP_MB3") # 读取风扇参数 local cpu_pwm=$(cat "$PWM_CPU" 2>/dev/null || echo "--") local hdd_pwm=$(cat "$PWM_HDD" 2>/dev/null || echo "--") local cpu_rpm=$(cat "$RPM_CPU" 2>/dev/null || echo "--") local hdd_rpm=$(cat "$RPM_HDD" 2>/dev/null || echo "--") local cpu_enable=$(cat "$PWM_CPU_ENABLE" 2>/dev/null || echo "--") local hdd_enable=$(cat "$PWM_HDD_ENABLE" 2>/dev/null || echo "--") # 模式转换 local cpu_mode hdd_mode case $cpu_enable in 0) cpu_mode="禁用";; 1) cpu_mode="手动";; 2) cpu_mode="自动";; *) cpu_mode="未知";; esac case $hdd_enable in 0) hdd_mode="禁用";; 1) hdd_mode="手动";; 2) hdd_mode="自动";; *) hdd_mode="未知";; esac # 显示系统状态 echo -e "${CYAN}系统状态${NC}" echo -e "${CYAN}-----------------------------------------${NC}" # 主板温度汇总显示 local mb_temps="" [[ "$mb_temp1" != "--" ]] && mb_temps+="$mb_temp1" [[ "$mb_temp2" != "--" ]] && mb_temps+="/$mb_temp2" [[ "$mb_temp3" != "--" ]] && mb_temps+="/$mb_temp3" mb_temps="${mb_temps#/}" # 去除开头的斜杠 if [[ -n "$mb_temps" ]]; then echo -e " CPU温度: ${cpu_temp}°C | 主板温度: ${mb_temps}°C" else echo -e " CPU温度: ${cpu_temp}°C" fi # 硬盘温度显示 local disk_list=$(detect_disk_devices) local nvme_disks=() local sata_disks=() if [[ -n "$disk_list" ]]; then # 分离NVMe和SATA硬盘 for disk in $disk_list; do if [[ "$disk" =~ ^nvme ]]; then nvme_disks+=("$disk") elif [[ "$disk" =~ ^sd ]]; then sata_disks+=("$disk") fi done echo " 硬盘温度:" # 显示NVMe硬盘(每个单独一行) for nvme_disk in "${nvme_disks[@]}"; do local nvme_temp=$(get_disk_temp "$nvme_disk") echo -e " ${nvme_disk}: ${nvme_temp}°C" done # 显示SATA硬盘(每行两个,用逗号分隔) if [[ ${#sata_disks[@]} -gt 0 ]]; then for ((i=0; i<${#sata_disks[@]}; i+=2)); do local sata_line=" " # 第一个硬盘 local disk1="${sata_disks[$i]}" local temp1=$(get_disk_temp "$disk1") sata_line+="${disk1}: ${temp1}°C" # 第二个硬盘(如果有) if [[ $((i+1)) -lt ${#sata_disks[@]} ]]; then local disk2="${sata_disks[$i+1]}" local temp2=$(get_disk_temp "$disk2") sata_line+=", ${disk2}: ${temp2}°C" fi echo "$sata_line" done fi else echo -e " 硬盘温度: 未检测到硬盘" fi echo -e "${CYAN}-----------------------------------------${NC}" # 风扇状态显示(分行显示) echo -e "${YELLOW}风扇状态${NC}" echo -e "${YELLOW}-----------------------------------------${NC}" # CPU风扇(名称和详细信息分行) echo -e " CPU风扇" if [[ "$cpu_mode" == "手动" ]]; then echo -e " ${GREEN}PWM: ${cpu_pwm} | 转速: ${cpu_rpm} RPM | 模式: ${cpu_mode}${NC}" elif [[ "$cpu_mode" == "自动" ]]; then echo -e " ${BLUE}PWM: ${cpu_pwm} | 转速: ${cpu_rpm} RPM | 模式: ${cpu_mode}${NC}" else echo -e " ${RED}PWM: ${cpu_pwm} | 转速: ${cpu_rpm} RPM | 模式: ${cpu_mode}${NC}" fi echo # 空行分隔 # 硬盘风扇(名称和详细信息分行) echo -e " 硬盘风扇" if [[ "$hdd_mode" == "手动" ]]; then echo -e " ${GREEN}PWM: ${hdd_pwm} | 转速: ${hdd_rpm} RPM | 模式: ${hdd_mode}${NC}" elif [[ "$hdd_mode" == "自动" ]]; then echo -e " ${BLUE}PWM: ${hdd_pwm} | 转速: ${hdd_rpm} RPM | 模式: ${hdd_mode}${NC}" else echo -e " ${RED}PWM: ${hdd_pwm} | 转速: ${hdd_rpm} RPM | 模式: ${hdd_mode}${NC}" fi echo -e "${YELLOW}-----------------------------------------${NC}\n" } # ========================= 风扇控制 ========================= set_fan_control() { # 设置风扇为手动模式并指定PWM值 echo "1" > "$PWM_CPU_ENABLE" 2>/dev/null echo "1" > "$PWM_HDD_ENABLE" 2>/dev/null echo "$1" > "$PWM_CPU" 2>/dev/null echo "$2" > "$PWM_HDD" 2>/dev/null return $? } apply_manual_mode() { local mode_name="$1" cpu_pwm="$2" hdd_pwm="$3" print_info "切换到「${mode_name}」模式..." if set_fan_control "$cpu_pwm" "$hdd_pwm"; then print_success "已切换到「${mode_name}」模式" echo -e " CPU风扇: ${cpu_pwm}, 硬盘风扇: ${hdd_pwm}" systemctl stop "$SERVICE_NAME" 2>/dev/null return 0 else print_error "设置失败" return 1 fi } # ========================= 智能模式核心 ========================= smart_auto_main() { # 后台服务模式主循环 echo "1" > "$PWM_CPU_ENABLE" 2>/dev/null echo "1" > "$PWM_HDD_ENABLE" 2>/dev/null while true; do local cpu_temp=$(read_temp_c "$TEMP_CPU") local cpu_pwm hdd_pwm # 温度-PWM映射 if [[ "$cpu_temp" == "--" ]] || [[ $cpu_temp -lt 40 ]]; then cpu_pwm=80; hdd_pwm=60 elif [[ $cpu_temp -lt 50 ]]; then cpu_pwm=120; hdd_pwm=100 elif [[ $cpu_temp -lt 60 ]]; then cpu_pwm=180; hdd_pwm=150 else cpu_pwm=220; hdd_pwm=200 fi echo "$cpu_pwm" > "$PWM_CPU" 2>/dev/null echo "$hdd_pwm" > "$PWM_HDD" 2>/dev/null sleep "$AUTO_CHECK_INTERVAL" done } # ========================= 服务管理 ========================= install_service() { print_header print_info "正在安装智能风扇系统服务..." # 部署脚本文件 local current_script="$0" if [[ "$current_script" != "$SCRIPT_PATH" ]]; then cp "$current_script" "$SCRIPT_PATH" chmod +x "$SCRIPT_PATH" print_success "脚本已安装到: $SCRIPT_PATH" fi # 创建systemd服务 cat > "$SERVICE_FILE" << EOF [Unit] Description=海康R1智能风扇控制服务 After=multi-user.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=5 User=root ExecStart=$SCRIPT_PATH --daemon [Install] WantedBy=multi-user.target EOF if [[ $? -eq 0 ]]; then print_success "服务文件已创建" systemctl daemon-reload systemctl enable "$SERVICE_NAME" systemctl start "$SERVICE_NAME" if systemctl is-active --quiet "$SERVICE_NAME"; then print_success "智能风扇服务已启动并设为开机自启" print_info "查看状态: systemctl status $SERVICE_NAME" else print_error "服务启动失败" systemctl status "$SERVICE_NAME" fi else print_error "创建服务文件失败" return 1 fi echo -e "\n按回车键返回主菜单..." read } manage_service() { print_header print_info "智能风扇服务管理" echo -e "${CYAN}-----------------------------------------${NC}" if [[ -f "$SERVICE_FILE" ]]; then local status=$(systemctl is-active "$SERVICE_NAME") local enabled=$(systemctl is-enabled "$SERVICE_NAME" 2>/dev/null || echo "disabled") echo -e " 服务状态: $status" echo -e " 开机自启: $enabled\n" echo -e "${YELLOW}操作选项:${NC}" echo " 1. 启动服务" echo " 2. 停止服务" echo " 3. 重启服务" echo " 4. 查看服务状态" echo " 5. 禁用开机自启" echo " 6. 启用开机自启" echo " 0. 返回主菜单" echo -en "\n请选择: " read choice case $choice in 1) systemctl start "$SERVICE_NAME"; print_success "服务已启动" ;; 2) systemctl stop "$SERVICE_NAME"; print_success "服务已停止" ;; 3) systemctl restart "$SERVICE_NAME"; print_success "服务已重启" ;; 4) systemctl status "$SERVICE_NAME"; echo -n "按回车键继续..."; read ;; 5) systemctl disable "$SERVICE_NAME"; print_success "已禁用开机自启" ;; 6) systemctl enable "$SERVICE_NAME"; print_success "已启用开机自启" ;; 0) return ;; esac else print_warning "智能风扇服务未安装" echo -en "\n是否现在安装?(y/N): " read answer [[ "$answer" == "y" || "$answer" == "Y" ]] && install_service fi echo -en "\n按回车键返回..." read } # ========================= 主菜单 ========================= show_main_menu() { while true; do print_header show_system_status # 服务状态显示(修复颜色显示问题) local service_status="未安装" if [[ -f "$SERVICE_FILE" ]]; then if systemctl is-active --quiet "$SERVICE_NAME"; then service_status="${GREEN}运行中${NC}" else service_status="${YELLOW}已停止${NC}" fi fi echo -e "${GREEN}主菜单${NC}" echo -e "${GREEN}-----------------------------------------${NC}" echo " 1. 静音模式 (CPU=80, HDD=60)" echo " 2. 适中模式 (CPU=120, HDD=100)" echo " 3. 积极模式 (CPU=180, HDD=150)" echo -e " 4. 智能风扇服务管理 [$service_status]" echo " 0. 退出" echo -e "${GREEN}-----------------------------------------${NC}" echo -en "请选择: " read choice case $choice in 1) read cpu hdd <<< "${MANUAL_PRESETS[静音]}"; apply_manual_mode "静音" "$cpu" "$hdd"; sleep 2 ;; 2) read cpu hdd <<< "${MANUAL_PRESETS[适中]}"; apply_manual_mode "适中" "$cpu" "$hdd"; sleep 2 ;; 3) read cpu hdd <<< "${MANUAL_PRESETS[积极]}"; apply_manual_mode "积极" "$cpu" "$hdd"; sleep 2 ;; 4) manage_service ;; 0) print_header; echo -e "${GREEN}感谢使用${NC}\n"; exit 0 ;; *) print_error "无效选择"; sleep 1 ;; esac done } # ========================= 主程序入口 ========================= main() { [[ "$EUID" -ne 0 ]] && { print_error "请使用 sudo 运行"; exit 1; } check_hardware || { print_error "硬件检测失败"; exit 1; } [[ "$1" == "--daemon" ]] && smart_auto_main show_main_menu } # 启动主程序 trap 'echo -e "\n${RED}程序被中断${NC}"; exit 1' INT TERM main "$@" |
回复 山归山 取消回复