收起左侧

fnOS 控制绿联设备的 Led 灯控代码

19
回复
3098
查看
[ 复制链接 ]

0

主题

0

回帖

0

牛值

江湖小虾

2025-6-3 13:19:08 显示全部楼层 阅读模式

准备工作

开启SSH
SSH登陆FnOS切换root sudo -i

下载 ugreen_leds_cli 工

切换到 root

1:sudo -i

下载 ugreen_leds_cli 工具

2:cd /usr/bin

3:wget https://github.com/miskcoo/ugreen_leds_controller/releases/download/v0.1-debian12/ugreen_leds_cli

4:chmod +x ugreen_leds_cli

检查功能能不能用

5 :./ugreen_leds_cli all -off

如果报以下错误
Err: fail to open the I2C device.
Please check that (1) you have the root permission;
and (2) the i2c-dev module is loaded.
就执行下面的代码
6:sudo modprobe i2c-dev

完整监控脚本(包含电源和网口 LED 控制)

#!/bin/bash

# 飞牛NAS多设备LED监控脚本
# 功能:
# - 硬盘:待机时白色常亮,读写时根据操作类型闪烁
# - 电源:开机后保持白色常亮
# - 网口:无流量时白色常亮,有流量时七彩呼吸灯(流量越大呼吸越快)

# 配置参数(请根据实际设备修改)
DISKS=("sda" "sdb" "sdc" "sdd")    # 硬盘设备名
DISK_LEDS=("disk1" "disk2" "disk3" "disk4")  # 硬盘对应的LED名称
POWER_LED="power"                 # 电源LED名称
NETDEV_LED="netdev"               # 网口LED名称
CHECK_INTERVAL=0.2                # 检查间隔(秒)
DISK_BLINK_RATE=200               # 硬盘活动时闪烁速率(毫秒)
IDLE_BRIGHTNESS=180               # 待机时亮度(0-255)
MAX_BRIGHTNESS=255                # 最大亮度(0-255)
NETDEV_BASE_SPEED=2000            # 网口无流量时的呼吸速度(毫秒)
NETDEV_MAX_SPEED=500              # 网口最大流量时的呼吸速度(毫秒)

# 颜色定义
IDLE_COLOR="255 255 255"          # 待机时白色 (RGB)
DISK_READ_COLOR="0 0 255"         # 硬盘读取时蓝色 (RGB)
DISK_WRITE_COLOR="255 0 0"        # 硬盘写入时红色 (RGB)
DISK_MIXED_COLOR="255 0 255"      # 硬盘混合操作时紫色 (RGB)

# 七彩灯颜色序列(用于网口流量显示)
RAINBOW_COLORS=(
    "255 0 0"    # 红
    "255 127 0"  # 橙
    "255 255 0"  # 黄
    "0 255 0"    # 绿
    "0 0 255"    # 蓝
    "75 0 130"   # 靛
    "148 0 211"  # 紫
)

# 定义命令路径
LED_CLI="/usr/bin/ugreen_leds_cli"

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | logger -t "disk-led"
}

# 获取硬盘I/O计数
get_disk_io() {
    local disk=$1
    cat /sys/block/$disk/stat 2>/dev/null | awk '{print $1, $5}' || echo "0 0"
}

# 获取网络接口流量(单位:KB/s)
get_netdev_traffic() {
    local iface="eth0"  # 默认网卡,可修改为实际网卡名称
    local rx_bytes=$(cat /sys/class/net/$iface/statistics/rx_bytes 2>/dev/null || echo 0)
    local tx_bytes=$(cat /sys/class/net/$iface/statistics/tx_bytes 2>/dev/null || echo 0)
    local total_bytes=$((rx_bytes + tx_bytes))
  
    # 计算流量变化率
    local traffic_diff=$((total_bytes - ${prev_net_bytes:-0}))
    prev_net_bytes=$total_bytes
  
    # 转换为KB/s
    echo $((traffic_diff / 1024 / CHECK_INTERVAL))
}

# 设置网口LED为七彩呼吸灯
set_netdev_rainbow() {
    local traffic=$1
    local speed=$((NETDEV_BASE_SPEED - (traffic > 100 ? 100 : traffic) * (NETDEV_BASE_SPEED - NETDEV_MAX_SPEED) / 100))
  
    # 根据流量计算呼吸速度(流量越大,速度越快)
    local color_index=$(( $(date +%s%N) / 100000000 % ${#RAINBOW_COLORS[@]} ))
    local color=${RAINBOW_COLORS[$color_index]}
  
    $LED_CLI $NETDEV_LED -color $color -breath $speed $speed
}

log "启动飞牛NAS多设备LED监控服务..."

# 初始化LED状态
log "初始化电源LED为白色常亮"
$LED_CLI $POWER_LED -color $IDLE_COLOR -brightness $MAX_BRIGHTNESS -on

log "初始化网口LED为白色常亮"
$LED_CLI $NETDEV_LED -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on

# 初始化硬盘LED为白色常亮
for ((i=0; i<${#DISKS[@]}; i++)); do
    log "初始化硬盘LED ${DISK_LEDS[$i]} 为白色常亮"
    $LED_CLI ${DISK_LEDS[$i]} -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
    disk_counts[$i]=$(get_disk_io ${DISKS[$i]})
done

# 初始化网络流量
prev_net_bytes=$(get_netdev_traffic)

trap "cleanup; exit" SIGINT SIGTERM

cleanup() {
    log "停止监控服务,关闭所有LED"
    $LED_CLI $POWER_LED -off
    $LED_CLI $NETDEV_LED -off
  
    for ((i=0; i<${#DISKS[@]}; i++)); do
        $LED_CLI ${DISK_LEDS[$i]} -off
    done
}

log "开始监控所有设备状态..."

while true; do
    # 检查硬盘状态
    for ((i=0; i<${#DISKS[@]}; i++)); do
        disk=${DISKS[$i]}
        led=${DISK_LEDS[$i]}
    
        # 检查硬盘是否存在
        if [ ! -e "/sys/block/$disk" ]; then
            $LED_CLI $led -off
            continue
        fi
    
        # 获取当前I/O计数
        curr_counts=$(get_disk_io $disk)
        prev_counts=${disk_counts[$i]}
    
        # 计算差值
        read_diff=$(( $(echo $curr_counts | awk '{print $1}') - $(echo $prev_counts | awk '{print $1}') ))
        write_diff=$(( $(echo $curr_counts | awk '{print $2}') - $(echo $prev_counts | awk '{print $2}') ))
    
        # 根据硬盘状态控制LED
        if [ $read_diff -gt 0 ] && [ $write_diff -eq 0 ]; then
            # 读取活动:蓝色闪烁
            $LED_CLI $led -color $DISK_READ_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
        elif [ $write_diff -gt 0 ] && [ $read_diff -eq 0 ]; then
            # 写入活动:红色闪烁
            $LED_CLI $led -color $DISK_WRITE_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
        elif [ $read_diff -gt 0 ] && [ $write_diff -gt 0 ]; then
            # 混合活动:紫色闪烁
            $LED_CLI $led -color $DISK_MIXED_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
        else
            # 待机状态:白色常亮
            $LED_CLI $led -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
        fi
    
        # 更新计数
        disk_counts[$i]=$curr_counts
    done
  
    # 检查网络流量
    traffic=$(get_netdev_traffic)
  
    if [ $traffic -le 1 ]; then
        # 无流量:白色常亮
        $LED_CLI $NETDEV_LED -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
    else
        # 有流量:七彩呼吸灯(流量越大,呼吸越快)
        set_netdev_rainbow $traffic
    fi
  
    # 等待下一次检查
    sleep $CHECK_INTERVAL
done

部署步骤

创建脚本文件

nano /usr/local/sbin/feiniu_full_led_monitor.sh

粘贴上述代码,保存并设置权限:

chmod +x /usr/local/sbin/feiniu_full_led_monitor.sh

配置 systemd 服务

nano /etc/systemd/system/feiniu-led-monitor.service

添加以下内容

[Unit]
Description=FeiniuNAS Full LED Monitor
After=network.target local-fs.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/sbin/feiniu_full_led_monitor.sh
Restart=always
RestartSec=5
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KillMode=process
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

启动服务并设置开机自启

systemctl daemon-reload
systemctl enable feiniu-led-monitor
systemctl start feiniu-led-monitor
收藏
送赞 5
分享

4

主题

761

回帖

0

牛值

社区共建团

社区共建团荣誉勋章飞牛百度网盘玩家fnOS1.0上线纪念勋章

2025-6-4 10:54:52 显示全部楼层

把代码丢给ai看看,是这样回复的:

这是一个用于飞牛NAS设备的多设备LED状态监控脚本,主要功能是通过LED灯效直观显示硬盘、电源和网络接口的工作状态。我来分析一下这个脚本的主要特点和功能:

硬盘状态指示:
待机状态:白色常亮
读取操作:蓝色闪烁
写入操作:红色闪烁
混合操作:紫色闪烁
电源状态:
开机后保持白色常亮
网络接口状态:
无流量时:白色常亮
有流量时:七彩呼吸灯效果,且流量越大呼吸速度越快

脚本特点:

使用了系统级的硬件监控接口(/sys/block和/sys/class/net)
实现了精确的流量和IOPS计算
包含完善的日志记录功能
有优雅的退出处理(trap信号捕获)
所有参数可配置,便于适配不同硬件

使用建议:

1,需要根据实际硬件修改DISKS和DISK_LEDS数组
2,确保/usr/bin/ugreen_leds_cli命令存在并有执行权限
3,可以调整CHECK_INTERVAL改变监控频率
4,建议以root权限运行以确保能访问所有硬件信息

这个脚本非常适合需要直观监控NAS工作状态的场景,通过LED颜色和闪烁模式可以快速了解系统当前负载情况。

2

主题

3

回帖

0

牛值

江湖小虾

2025-6-4 14:24:06 显示全部楼层

谢谢分享

4

主题

36

回帖

0

牛值

江湖小虾

2025-6-4 20:57:03 显示全部楼层

内存上的灯光能控制吗

0

主题

1

回帖

0

牛值

江湖小虾

2025-6-11 10:11:17 显示全部楼层

感谢大神教程

按照步骤实施,但还有两个问题(设备:DXP4800)。

问题1:

使用 fnos app 的重启按钮重启后,所有灯不亮。关机再开机跑马灯依旧出现。已经执行了 启动服务并设置开机自启:的命令;

问题1 中重新开机依旧跑马灯的解决办法:

sudo nano /etc/modules

文本末尾添加

i2c-dev

保存并退出

问题1 中使用 fnos app 重启后,所有灯不亮暂未找到原因

问题2:

硬盘灯跟硬盘实际插入是反的,比如插入最右侧硬盘,但硬盘灯是最左边的亮。插入盘右2,灯左2亮。

问题2 按以下方式修改 feiniu_full_led_monitor.sh 中的代码解决:

将:

DISK_LEDS=("disk1" "disk2" "disk3" "disk4") # 硬盘对应的LED名称

改为:

DISK_LEDS=("disk4" "disk3" "disk2" "disk1") # 硬盘对应的LED名称

飞牛APP重启会导致灯不亮,但是从物理机电源键启动灯是亮的  详情 回复
2025-8-14 23:00

6

主题

315

回帖

0

牛值

系统先锋体验团🛩️

fnOS1.0上线纪念勋章飞牛百度网盘玩家

2025-6-12 08:50:39 显示全部楼层

没设备,用不上,但是点赞victory

飞牛藏墨,岁月静好。心有诗意,自在乾坤

0

主题

6

回帖

0

牛值

江湖小虾

2025-6-16 17:07:43 显示全部楼层

按照楼主的方法,4800 plus完美控制灯光,感谢楼主分享handshake

老哥能分享一下脚本配置不,我的灯全部常量,想参考你的  详情 回复
2025-6-22 20:26

5

主题

35

回帖

0

牛值

fnOS系统内测组

飞牛百度网盘玩家fnOS1.0上线纪念勋章

2025-6-22 20:26:38 显示全部楼层
emaic 发表于 2025-6-16 17:07
按照楼主的方法,4800 plus完美控制灯光,感谢楼主分享

老哥能分享一下脚本配置不,我的灯全部常量,想参考你的
不好意思啊兄弟,一直是手机上网,没留意 在楼主教程的第四步,插入:  详情 回复
2025-6-28 22:42

0

主题

6

回帖

0

牛值

江湖小虾

2025-6-28 22:42:53 显示全部楼层
cooling 发表于 2025-6-22 20:26
老哥能分享一下脚本配置不,我的灯全部常量,想参考你的

不好意思啊兄弟,一直是手机上网,没留意
在楼主教程的第四步,依次插入以下命令:
apt update
apt upgrade
apt install -y i2c-tools
modprobe -v i2c-dev
安装好i2c驱动
其他步骤完全按楼主教程


需要注意的是,编辑feiniu-led-monitor.service文件的时候,各条命令容易挤到一起,导致不起作用,用xshell可以解决


其他步骤完全按楼主的动作即可


PS:我的是DXP4800plus
1

查看全部评分

4

主题

9

回帖

0

牛值

江湖小虾

2025-7-11 12:00:45 显示全部楼层

我用的dxp8800pro,按照改完之后灯亮的不是很对。之后就是重启就起不来,但是重新开机能起来。不知道啥情况有点懵逼

4

主题

9

回帖

0

牛值

江湖小虾

2025-7-11 19:53:47 显示全部楼层

重启貌似就是久了一点,目前一顿折腾灯是可以亮,就是接几块硬盘就亮几个灯。但是灯是按照顺序亮的不管放那个位置都是按照顺序亮emm

5

主题

18

回帖

0

牛值

江湖小虾

2025-7-30 08:53:53 显示全部楼层

好东西,感谢分享

4

主题

58

回帖

0

牛值

fnOS系统内测组

2025-8-1 16:02:12 显示全部楼层

必须赞一个,正需要,研究一下

4

主题

58

回帖

0

牛值

fnOS系统内测组

2025-8-14 21:47:38 显示全部楼层

按照上面的方法测试了,4800效果完美 handshakehandshake,感谢大佬分享

4

主题

58

回帖

0

牛值

fnOS系统内测组

2025-8-14 23:00:56 显示全部楼层
gamore 发表于 2025-6-11 10:11
感谢大神教程
按照步骤实施,但还有两个问题(设备:DXP4800)。
问题1:

飞牛APP重启会导致灯不亮,但是从物理机电源键启动灯是亮的,加了问题1提供的代码,可以正常重启灯也正常了。

0

主题

2

回帖

0

牛值

江湖小虾

2025-9-23 10:57:20 显示全部楼层

绿联4800按照教程,成功运行,感谢!

1

主题

4

回帖

0

牛值

江湖小虾

2025-9-23 21:02:26 显示全部楼层
绿联dxp4800 plus 测试没有问题

0

主题

39

回帖

0

牛值

江湖小虾

2025-10-21 17:24:40 显示全部楼层
感谢分享

2

主题

5

回帖

0

牛值

江湖小虾

2025-12-13 18:13:01 显示全部楼层

大佬,遇到一个问题。

机器型号DXP4800Pro,硬盘是插入1 2 4 的3个盘位.

现象是:LAN口是彩色灯,3号盘位亮灯了,4号盘位灯是熄灭。

1

主题

1

回帖

0

牛值

江湖小虾

2026-1-31 14:45:43 显示全部楼层

豆包优化


#!/bin/bash

# 飞牛NAS多设备LED监控脚本(修复版,兼容低版本shell/无浮点运算/简化版sleep)
# 功能:
# - 硬盘:待机时白色常亮,读写时根据操作类型闪烁
# - 电源:开机后保持白色常亮
# - 网口:无流量时白色常亮,有流量时七彩呼吸灯(流量越大呼吸越快)

# 配置参数(请根据实际设备修改,注意:CHECK_INTERVAL为小数秒,直接适配简化版sleep)
DISKS=("sda" "sdb" "sdc" "sdd")    # 硬盘设备名
DISK_LEDS=("disk1" "disk2" "disk3" "disk4")  # 硬盘对应的LED名称
POWER_LED="power"                 # 电源LED名称
NETDEV_LED="netdev"               # 网口LED名称
CHECK_INTERVAL=0.5                # 修复:改为小数秒(0.5=500毫秒),直接适配简化版sleep
DISK_BLINK_RATE=200               # 硬盘活动时闪烁速率(毫秒)
IDLE_BRIGHTNESS=180               # 待机时亮度(0-255)
MAX_BRIGHTNESS=255                # 最大亮度(0-255)
NETDEV_BASE_SPEED=2000            # 网口无流量时的呼吸速度(毫秒)
NETDEV_MAX_SPEED=500              # 网口最大流量时的呼吸速度(毫秒)

# 颜色定义
IDLE_COLOR="255 255 255"          # 待机时白色 (RGB)
DISK_READ_COLOR="0 0 255"         # 硬盘读取时蓝色 (RGB)
DISK_WRITE_COLOR="255 0 0"        # 硬盘写入时红色 (RGB)
DISK_MIXED_COLOR="255 0 255"      # 硬盘混合操作时紫色 (RGB)

# 七彩灯颜色序列(用于网口流量显示)
RAINBOW_COLORS=(
    "255 0 0"    # 红
    "255 127 0"  # 橙
    "255 255 0"  # 黄
    "0 255 0"    # 绿
    "0 0 255"    # 蓝
    "75 0 130"   # 靛
    "148 0 211"  # 紫
)

# 定义命令路径
LED_CLI="/usr/bin/ugreen_leds_cli"

# 修复:放弃关联数组(兼容低版本shell),改用普通变量存储状态
DISK_LED_STATE1="" DISK_LED_STATE2="" DISK_LED_STATE3="" DISK_LED_STATE4=""
NET_LED_STATE=""
POWER_LED_INITED=0
# 硬盘计数数组(提前初始化,避免下标错误)
disk_counts=("0 0" "0 0" "0 0" "0 0")
prev_net_bytes=0
traffic=0
# 新增:用于整数换算的辅助参数(避免浮点运算干扰)
CHECK_INTERVAL_MS=500             # 对应CHECK_INTERVAL=0.5秒,手动同步

# 日志函数(优化:减少日志输出频率,避免频繁写日志占用CPU)
log() {
    local log_level=$1
    local lo**sg=$2
    if [ "$log_level" = "info" ] || [ "$log_level" = "error" ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$log_level] $lo**sg" | logger -t "disk-led"
    fi
}

# 获取硬盘I/O计数(修复:用bash内置语法替代awk,无外部命令调用)
get_disk_io() {
    local disk=$1
    local stat_path="/sys/block/$disk/stat"
    if [ ! -f "$stat_path" ]; then
        echo "0 0"
        return
    fi
    # 读取stat文件内容,用bash内置分割,替代awk
    local stat_content=$(cat "$stat_path" 2>/dev/null)
    local arr=($stat_content)
    local read_count=${arr[0]:-0}
    local write_count=${arr[4]:-0}
    echo "$read_count $write_count"
}

# 获取网络接口流量(单位:KB/s)(修复:移除浮点运算,适配简化版sleep的小数间隔)
get_netdev_traffic() {
    local iface="eth0"  # 默认网卡,可修改为实际网卡名称
    local rx_path="/sys/class/net/$iface/statistics/rx_bytes"
    local tx_path="/sys/class/net/$iface/statistics/tx_bytes"
  
    # 内置读取,避免重复cat调用
    local rx_bytes=0
    [ -f "$rx_path" ] && rx_bytes=$(cat "$rx_path" 2>/dev/null)
    local tx_bytes=0
    [ -f "$tx_path" ] && tx_bytes=$(cat "$tx_path" 2>/dev/null)
  
    local total_bytes=$((rx_bytes + tx_bytes))
    local traffic_diff=$((total_bytes - prev_net_bytes))
    prev_net_bytes=$total_bytes
  
    # 修复:用CHECK_INTERVAL_MS(整数500)换算,避免浮点运算,结果与原逻辑一致
    # 500毫秒=0.5秒,1秒=1000毫秒,因此换算公式:(traffic_diff/1024) / 0.5 = (traffic_diff/1024)*2
    local kbps=$((traffic_diff / 1024 * 1000 / CHECK_INTERVAL_MS))
    # 确保返回非负整数,避免空值
    echo $((kbps > 0 ? kbps : 0))
}

# 设置网口LED为七彩呼吸灯(修复:状态缓存兼容低版本shell,无浮点运算)
set_netdev_rainbow() {
    local traffic=$1
    local speed=$((NETDEV_BASE_SPEED - (traffic > 100 ? 100 : traffic) * (NETDEV_BASE_SPEED - NETDEV_MAX_SPEED) / 100))
  
    # 限制速度范围,避免异常值
    speed=$((speed < NETDEV_MAX_SPEED ? NETDEV_MAX_SPEED : speed))
    speed=$((speed > NETDEV_BASE_SPEED ? NETDEV_BASE_SPEED : speed))
  
    # 修复:简化颜色索引计算,减少高精度时间调用(兼容低版本shell)
    local color_index=$(( (SECONDS * 10) % ${#RAINBOW_COLORS[@]} ))
    local color=${RAINBOW_COLORS[$color_index]}
  
    # 构建当前状态标识
    local current_state="rainbow_${speed}_${color}"
  
    # 修复:普通变量存储网口LED状态,避免关联数组
    if [ "$NET_LED_STATE" != "$current_state" ]; then
        $LED_CLI $NETDEV_LED -color $color -breath $speed $speed >/dev/null 2>&1
        NET_LED_STATE="$current_state"
    fi
}

# 修复:获取硬盘LED状态(根据下标返回对应状态变量)
get_disk_led_state() {
    local index=$1
    case $index in
        0) echo "$DISK_LED_STATE1" ;;
        1) echo "$DISK_LED_STATE2" ;;
        2) echo "$DISK_LED_STATE3" ;;
        3) echo "$DISK_LED_STATE4" ;;
        *) echo "" ;;
    esac
}

# 修复:设置硬盘LED状态(根据下标更新对应状态变量)
set_disk_led_state() {
    local index=$1
    local state=$2
    case $index in
        0) DISK_LED_STATE1="$state" ;;
        1) DISK_LED_STATE2="$state" ;;
        2) DISK_LED_STATE3="$state" ;;
        3) DISK_LED_STATE4="$state" ;;
    esac
}

log "info" "启动飞牛NAS多设备LED监控服务(修复版,兼容低版本shell/简化版sleep)..."

# 初始化LED状态(修复:移除函数外部local,增加判断避免重复初始化)
if [ $POWER_LED_INITED -eq 0 ]; then
    log "info" "初始化电源LED为白色常亮"
    $LED_CLI $POWER_LED -color $IDLE_COLOR -brightness $MAX_BRIGHTNESS -on >/dev/null 2>&1
    POWER_LED_INITED=1
  
    log "info" "初始化网口LED为白色常亮"
    $LED_CLI $NETDEV_LED -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on >/dev/null 2>&1
    NET_LED_STATE="idle_white"
  
    # 初始化硬盘LED为白色常亮(修复:移除函数外部的local关键字)
    for ((i=0; i<${#DISKS[@]}; i++)); do
        led=${DISK_LEDS[$i]}  # 移除local,改为普通全局变量,兼容低版本shell
        log "info" "初始化硬盘LED $led 为白色常亮"
        $LED_CLI $led -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on >/dev/null 2>&1
        set_disk_led_state $i "idle_white"
        disk_counts[$i]=$(get_disk_io ${DISKS[$i]})
    done
fi

# 初始化网络流量
prev_net_bytes=$(get_netdev_traffic)

# 清理函数(修复:简化操作,屏蔽输出)
cleanup() {
    log "info" "停止监控服务,关闭所有LED"
    $LED_CLI $POWER_LED -off >/dev/null 2>&1
    $LED_CLI $NETDEV_LED -off >/dev/null 2>&1
  
    for ((i=0; i<${#DISKS[@]}; i++)); do
        $LED_CLI ${DISK_LEDS[$i]} -off >/dev/null 2>&1
    done
    exit 0
}

trap "cleanup; exit" SIGINT SIGTERM

log "info" "开始监控所有设备状态(检查间隔:$CHECK_INTERVAL 秒/$CHECK_INTERVAL_MS 毫秒)..."

while true; do
    # 检查硬盘状态(修复:核心是状态缓存,移除函数外部local,兼容低版本shell)
    for ((i=0; i<${#DISKS[@]}; i++)); do
        disk=${DISKS[$i]}
        led=${DISK_LEDS[$i]}
        disk_stat_path="/sys/block/$disk"
      
        # 检查硬盘是否存在
        if [ ! -e "$disk_stat_path" ]; then
            current_state=$(get_disk_led_state $i)
            if [ "$current_state" != "off" ]; then
                $LED_CLI $led -off >/dev/null 2>&1
                set_disk_led_state $i "off"
            fi
            continue
        fi
  
        # 获取当前I/O计数
        curr_counts=$(get_disk_io $disk)
        prev_counts=${disk_counts[$i]}
  
        # 修复:用bash内置分割,替代awk,无外部命令
        curr_arr=($curr_counts)
        prev_arr=($prev_counts)
        read_diff=$(( ${curr_arr[0]:-0} - ${prev_arr[0]:-0} ))
        write_diff=$(( ${curr_arr[1]:-0} - ${prev_arr[1]:-0} ))
  
        # 定义当前硬盘状态
        current_disk_state=""
      
        if [ $read_diff -gt 0 ] && [ $write_diff -eq 0 ]; then
            # 读取活动:蓝色闪烁
            current_disk_state="blink_blue"
        elif [ $write_diff -gt 0 ] && [ $read_diff -eq 0 ]; then
            # 写入活动:红色闪烁
            current_disk_state="blink_red"
        elif [ $read_diff -gt 0 ] && [ $write_diff -gt 0 ]; then
            # 混合活动:紫色闪烁
            current_disk_state="blink_purple"
        else
            # 待机状态:白色常亮
            current_disk_state="idle_white"
        fi
  
        # 修复:只有状态变化时,才调用LED命令(兼容低版本shell状态存储)
        last_state=$(get_disk_led_state $i)
        if [ "$last_state" != "$current_disk_state" ]; then
            case $current_disk_state in
                "blink_blue")
                    $LED_CLI $led -color $DISK_READ_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE >/dev/null 2>&1
                    ;;
                "blink_red")
                    $LED_CLI $led -color $DISK_WRITE_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE >/dev/null 2>&1
                    ;;
                "blink_purple")
                    $LED_CLI $led -color $DISK_MIXED_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE >/dev/null 2>&1
                    ;;
                "idle_white")
                    $LED_CLI $led -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on >/dev/null 2>&1
                    ;;
            esac
            set_disk_led_state $i "$current_disk_state"
        fi
  
        # 更新计数
        disk_counts[$i]=$curr_counts
    done
  
    # 检查网络流量(修复:确保traffic有默认值,避免unary operator错误)
    traffic=$(get_netdev_traffic)
    # 确保traffic为非空整数
    traffic=${traffic:-0}
  
    if [ $traffic -le 1 ]; then
        # 无流量:白色常亮
        if [ "$NET_LED_STATE" != "idle_white" ]; then
            $LED_CLI $NETDEV_LED -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on >/dev/null 2>&1
            NET_LED_STATE="idle_white"
        fi
    else
        # 有流量:七彩呼吸灯(流量越大,呼吸越快)
        set_netdev_rainbow $traffic
    fi
  
    # 修复:直接使用小数秒休眠,适配简化版sleep(核心解决sleep报错)
    sleep $CHECK_INTERVAL
done
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则