You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过命令行工具确认外接USB磁盘的就绪状态以整合到挂载脚本中

如何通过命令行工具确认外接USB磁盘的就绪状态以整合到挂载脚本中

我太懂你这种靠摸硬盘振动判断就绪的操作了——虽然接地气,但脚本里总不能让程序“摸硬盘”对吧?别担心,有几个实用的命令行工具能帮你自动检测外接USB硬盘的就绪状态,完美替代手动摸振动的步骤,轻松整合到挂载脚本里。

1. 用 udevadm settle 等系统完成设备初始化

Linux的udev系统会负责处理外接设备的识别、驱动加载甚至自动fsck这类操作,udevadm settle 就是专门用来等待所有pending的udev事件处理完成的工具。你只需要在脚本里插电后加上这一行:

# 等待系统完成磁盘的初始化、fsck等操作,超时设为60秒可按需调整
udevadm settle --timeout=60

这个命令会一直等到udev把磁盘相关的所有操作都处理完才返回,相当于替你“等振动停下来”,非常适合脚本里的前置检查。

2. 用 blkid + lsblk 循环检查分区就绪状态

如果需要更精准地确认某个特定分区是否就绪(比如你的MyBook有多个分区),可以结合blkid(识别分区UUID)和lsblk(查看设备状态)写个循环检查逻辑,比如:

#!/bin/bash
# 替换成你目标分区的UUID(用blkid命令可以查到)
TARGET_UUID="xxxx-xxxx"
# 最长等待时间,单位秒
MAX_WAIT=60
WAIT_COUNT=0

while true; do
    # 通过UUID查找对应的设备路径
    DEVICE=$(blkid -U "$TARGET_UUID")
    if [ -n "$DEVICE" ]; then
        # 获取磁盘主设备(比如/dev/sdb1对应/dev/sdb)并检查状态
        DISK_DEV=$(echo "$DEVICE" | sed 's/[0-9]*$//')
        STATE=$(lsblk -d "$DISK_DEV" --noheadings --output STATE)
        if [ "$STATE" = "running" ]; then
            echo "目标分区已就绪,开始挂载..."
            mount "$DEVICE" /mnt/your-backup-point
            break
        fi
    fi
    # 超时判断
    WAIT_COUNT=$((WAIT_COUNT + 1))
    if [ "$WAIT_COUNT" -ge "$MAX_WAIT" ]; then
        echo "超时警告:磁盘未在${MAX_WAIT}秒内就绪"
        exit 1
    fi
    sleep 1
done

用UUID而不是/dev/sdbX这种设备名的好处是,不管USB磁盘每次识别成哪个设备号,都能精准定位到你的目标分区,避免挂载错误。

小提示

  • 如果你不确定自己磁盘的UUID,直接运行blkid命令就能看到所有已识别分区的UUID信息。
  • 可以把udevadm settle和循环检查结合起来,先让系统完成初始化,再精准检查分区,双重保障更可靠。

备注:内容来源于stack exchange,提问作者Eric Marceau

火山引擎 最新活动